与EF4一起使用,VS 2010中的模型优先方法:
考虑以下EntityModel:
“ OrderBase”是只有一个属性“ Name”的抽象实体
“详细信息”(具有一个“文本”属性)是一个与“ OrderBase”具有多对一关联的实体(即,一个OrderBase具有多个“详细信息”)
“注释”(具有一个“文本”属性)是一个与“ OrderBase”具有多对一关联的实体(即,一个OrderBase具有多个注释)
“ MusicOrder”是从“ OrderBase”派生的实体,仅具有一个属性“ Quantity”(int)
“ SongOrder”是从“ OrderBase”派生的实体,仅具有一个属性“ Length”(int)。 SongOrder与MusicOrder具有多对一关系(即,一个MusicOrder具有多个SonOrder)
快速概述:
想要发布datamdel的图像,但我不允许...关于数据模型的任何问题。
因此,现在我生成数据库,执行ddl脚本并尝试运行以下代码:
using (DataContainer container = new DataContainer())
{
MusicOrder musicOrder = new MusicOrder{Name = "Oldies", Quantity = 1};
SongOrder songOrder = new SongOrder {Name = "Great balls of fire", Length = 240};
songOrder.Details.Add(new Detail{Text = "Song from Jerry Lee Lewis"});
songOrder.Comments.Add(new Comment{Text = "Cool song"});
container.OrderBaseSet.AddObject(songOrder); //relevant line
musicOrder.SongOrders.Add(songOrder);
songOrder.Details.Clear();
songOrder.Comments.Clear();
container.OrderBaseSet.AddObject(musicOrder);
container.SaveChanges();
}
在这种情况下,“ SaveChanges”会导致一个异常,告诉我有关丢失外键关系的一些信息...
但是如果我移动线
container.OrderBaseSet.AddObject(songOrder);
在“清除”部分之后,导致以下代码:
using (DataContainer container = new DataContainer())
{
MusicOrder musicOrder = new MusicOrder{Name = "Oldies", Quantity = 1};
SongOrder songOrder = new SongOrder {Name = "Great balls of fire", Length = 240};
songOrder.Details.Add(new Detail{Text = "Song from Jerry Lee Lewis"});
songOrder.Comments.Add(new Comment{Text = "Cool song"});
musicOrder.SongOrders.Add(songOrder);
songOrder.Details.Clear();
songOrder.Comments.Clear();
container.OrderBaseSet.AddObject(songOrder); //relevant line
container.OrderBaseSet.AddObject(musicOrder);
container.SaveChanges();
}
一切正常。
如您所见,我知道如何解决该异常,而且我知道“双重添加” SongOrder没有任何意义。但是我想知道这是错误还是功能。为什么在我的第一个示例中抛出异常。非常感谢您提供全面的解释。我认为,实体框架还应该能够处理第一个示例,并且不会抛出异常。所以我会说这是一个错误。
随时发表评论;)
和我
最佳答案
发生这种情况是因为调用AddObject
不仅会添加单个实体,而且不会添加未附加到上下文的所有相关实体。因此,在第一个示例中调用AddObject(songOrder)
时,还要添加Detail
和Comment
。但是之后,您可以在导航属性上调用Remove
以同时删除Detial
和Comment
。附加实体上的Remove
只会断开关系,但不会从上下文中删除Detail
和Comment
(只会将其主要关系设置为null),因此一旦您尝试调用SaveChanges
,它将爆炸,因为您正在尝试保存没有关联的Detail
的Comment
和OrderBase
(我想关系不是nullalbe)。
在第二个示例中,将Comment
和Detail
删除之前,先向上下文中添加顺序,以便其行为符合预期。
这不是错误,而是“功能”。
关于c# - Entity Framework 外键跟踪导致问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6199198/