代码改变世界

LINQ TO SQL学习笔记(5)_SQLMetal和Mapping文件缺陷

2009-04-16 13:17  宗哥  阅读(724)  评论(1编辑  收藏  举报

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();


            }

 

运行:

“/”应用程序中的服务器错误。

DELETE 语句与 REFERENCE 约束"FK_Order_Details_Orders"冲突。该冲突发生于数据库"Northwind",表"dbo.Order Details", column 'OrderID'。
语句已终止。

说明: 执行当前 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郁闷!

本文代码下载:下载

;