Mapping文件的缺陷
開發LINQ TO SQL,我個人傾向選擇外部配置文件的方式進行開發,靈活,(這個也是.Net平台下的建議選擇,如果你了解WCF,會更有體會)。 利用SQLMeatal開發Mapping文件的時候,在修改Association節的DeleteRule屬性的時候,感覺是LING TO SQL的缺陷。
MSND:
NET Framework 類庫
AssociationAttribute..::.DeleteRule 屬性
更新:2007 年 11 月
獲取或設置關聯的刪除行為。
命名空間: System.Data.Linq.Mapping
程序集: System.Data.Linq(在 System.Data.Linq.dll 中)
類型:System..::.String
一個表示規則的字符串。
備注
如果設置為 null,則不會添加任何刪除行為。例如,“CASCADE”會將“ON DELETE CASCADE”添加到外鍵關系
本例子以NorthWind為例子,按照這種說法,我在Order和Oder_Detail對象的關系設置如下:
<Association Name="FK_Order_Details_Orders" Member="OrderDetails" Storage="_OrderDetails" ThisKey="OrderID" OtherKey="OrderID" DeleteRule="ON DELETE CASCADE" />
這樣即使我把數據庫中Oders表和Order Details表之間關系解除,LINQ TO SQL運行時應該會探測這一關系,進行先刪除Order Details相關的行,然後再刪除Order。
然而事實是這樣:
代碼如下:
string con = "server=.;database=Northwind;uid=sa;pwd=Mypass800624";
string xmlFilePath = @"D:\MyStudy\LINQToSQL\WebApplication1\MapNorthwind.Xml";
XmlMappingSource mapping = XmlMappingSource.FromXml(File.ReadAllText(xmlFilePath));
using (ObjNorthwind context = new ObjNorthwind(con, mapping))
{
var obj = context.Orders.Where(p => p.OrderID == 10250);
context.Orders.DeleteAllOnSubmit(obj);
context.SubmitChanges();
}
運行:
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。
異常詳細信息: System.Data.SqlClient.SqlException: DELETE 語句與 REFERENCE 約束"FK_Order_Details_Orders"沖突。該沖突發生於數據庫"Northwind",表"dbo.Order Details", column 'OrderID'。
語句已終止。
為什麼LINQ TO SQL 不去探測這個級聯關系,自動生成生成先刪除[Order Details]表的管理子表哪 ?哪這個配置文件這個屬性有什麼用?
另外SQlMetal這個工具提供的InterFace太可憐了,看看MyGeneration郁悶!