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

时间:2010-07-20 11:26:02

标签: linq linq-to-sql

为什么以下内容向DataContent ChangeSet添加Insert(新地址),如何阻止它这样做?

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

3 个答案:

答案 0 :(得分:2)

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

Address.StateProvinceID = db.StateProvinces.First().StateProvinceID;

如果您可以在没有直接对象引用的情况下工作。除了通过PLINQO(http://plinqo.com/default.aspx?AspxAutoDetectCookieSupport=1)之外,没有直接的方法可以在LINQ to SQL中分离实体。

答案 1 :(得分:2)

  

地址a =新地址();

这将创建一个新的Address实例。它不以任何方式与datacontext相关联。

  

db.StateProvinces.First();

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

  

a.StateProvince =

这是属性的赋值。如果检查自动生成的属性“StateProvince”,您将看到它还更新StateProvince实例上的相关属性“Addresses”。现在StateProvince实例已经改变了。这会导致数据库被通知,结果 - db现在将地址实例作为新的,准备插入的实例进行跟踪。

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

db.ObjectTrackingEnabled = false;

PS。 var很酷,就像热狗一样棒。

答案 2 :(得分:1)

它正在这样做,因为你正在检索“StateProvince”并将新地址上的外键设置为现有的州省,因为地址是新的,然后更改集将为它构建插入因为我怀疑你有通过将新地址无意添加到StateProvince实体的Addresses集合来更改州的省份。您可以尝试从分配中删除子属性,因为在州省实体上拥有关联地址的集合可能没有用。

您还可以尝试以下方法:

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

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