与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)时,还要添加DetailComment。但是之后,您可以在导航属性上调用Remove以同时删除DetialComment。附加实体上的Remove只会断开关系,但不会从上下文中删除DetailComment(只会将其主要关系设置为null),因此一旦您尝试调用SaveChanges,它将爆炸,因为您正在尝试保存没有关联的DetailCommentOrderBase(我想关系不是nullalbe)。

在第二个示例中,将CommentDetail删除之前,先向上下文中添加顺序,以便其行为符合预期。

这不是错误,而是“功能”。

关于c# - Entity Framework 外键跟踪导致问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6199198/

10-11 20:41