【发布时间】:2011-05-02 03:21:19
【问题描述】:
我正在使用带有 POCO 的 EF4,下面的代码是我必须更新许可证的代码。我只在此处粘贴了与问题相关的代码部分,即添加 LicenseDetails。
问题在于,对于插入的每个 LicenseDetail,EF 还会意外地将行添加到“Item”查找表中。为什么?!
在数据库(SQLServer 2008)中定义的两个表的关系如下图,我先做Database,所以EF根据这个生成实体的关系。
ALTER TABLE [dbo].[LicenseDetail]
WITH CHECK ADD CONSTRAINT [FK_LicenseDetail_Item] FOREIGN KEY([ItemId])
REFERENCES [dbo].[Item] ([Id])
GO
ALTER TABLE [dbo].[LicenseDetail] CHECK CONSTRAINT [FK_LicenseDetail_Item]
GO
更新方法:
public static void UpdateLicense(License license)
{
using (ALISEntities context = new ALISEntities())
{
context.ContextOptions.ProxyCreationEnabled = true;
var storedLicense =
context.Licenses.Include("LicenseDetails")
.Where(o => o.Id == license.Id).SingleOrDefault();
//////////////////////////////////////////////////////////////
// license details to add
List<LicenseDetail> toAdd = new List<LicenseDetail>();
foreach (LicenseDetail ld in license.LicenseDetails)
{
if (storedLicense.LicenseDetails
.Where(d => d.ItemId == ld.ItemId).Count() == 0)
{
toAdd.Add(ld);
}
}
toAdd.ForEach(i => storedLicense.LicenseDetails.Add(i));
context.SaveChanges();
}
}
【问题讨论】: