在Linq to SQL中,为什么分配相关实体会创建变更集插入?

在Linq to SQL中,为什么分配相关实体会创建变更集插入?,linq,linq-to-sql,Linq,Linq To Sql,为什么下面要向DataContent变更集添加(新地址的)插入,我如何阻止它这样做 var db = new DataClasses1DataContext(); var a = new Address(); a.StateProvince = db.StateProvinces.First(); Console.WriteLine(db.GetChangeSet().Inserts.Count); 它这样做是因为您正在检索“州省”,并将新地址上的外键设置为现有州省,因为地址是新的,所以更改集

为什么下面要向DataContent变更集添加(新地址的)插入,我如何阻止它这样做

var db = new DataClasses1DataContext();
var a = new Address();
a.StateProvince = db.StateProvinces.First();
Console.WriteLine(db.GetChangeSet().Inserts.Count);

它这样做是因为您正在检索“州省”,并将新地址上的外键设置为现有州省,因为地址是新的,所以更改集将为其生成一个插入,因为我怀疑您已通过不必要地将新地址添加到StateProvince实体上的Addresses集合来更改了state province。您可以尝试从关联中删除子属性,因为在州-省实体上拥有关联地址的集合可能没有用处

您也可以尝试以下方法:

DataClasses1DataContext db = new DataClasses1DataContext();
db.ObjectTrackingEnabled = false;
Address a = new Address();
a.StateProvince = db.StateProvinces.First();

您可能还注意到我已经删除了您对var的公然滥用;-)

因为数据上下文知道该州的省份,所以它会自动将插入地址排队。只要你不提交,地址就永远不会被创建。此外,要解决此问题,请设置:

Address.StateProvinceID = db.StateProvinces.First().StateProvinceID;
如果可以在没有直接对象引用的情况下工作。除了通过PLINQO()之外,没有直接的方法将LINQ中的实体分离到SQL

地址a=新地址()

这将创建地址的新实例。它与datacontext没有任何关联

db.stateProvisions.First()

这将加载StateProvince的一个实例。实例由加载它的datacontext(db)跟踪。db正在等待来自此实例的更改通知

a、 州省=

这是一项财产转让。如果检查自动生成的属性“StateProvince”,您将看到它还更新StateProvince实例上的相关属性“Addresses”。现在StateProvince实例已更改。这会导致db收到通知,因此,db现在会跟踪address实例作为一个新的、准备插入的实例

最简单的解决方法是,在使用db之前,设置:

db.ObjectTrackingEnabled = false;

注:var就像热狗一样棒。

虐待?当新的ing是
var
的主要用途之一时,消除重复的
ReallyLongClassNames
。。。如果右边的类型不是绝对清楚的话,我只会将其视为滥用-
var x=new Foo()是完全可读的和不含糊的。VAR被添加到C中的唯一原因是允许匿名类型,我认为任何其他使用都是var滥用。如果它是因为其他原因添加的,那么它会被更早地添加。你也是公司中最后一个停止使用匈牙利符号的人吗?var真是太棒了。。。它使快速编写代码变得非常容易。。。我一直在使用它。@Brian:同意-如果赋值运算符的右侧清楚地说明类型,我认为
var
绝对可以。我认为如果右侧不明确,应该在左侧声明类型(代替
var
),例如方法调用。这样做并不是“滥用”,它只是高效(你不会为了它而重复自己),更容易编码(键入
var
比键入完整的类型名容易得多),更容易阅读(更少的视觉混乱)。