具有外键的实体框架POCO

时间:2010-11-12 16:51:25

标签: entity-framework foreign-keys entity poco

我可以通过示例代码更好地解释我的问题。我正在使用POCO和默认情况下由C#POCO生成器生成的更改跟踪代理。请参阅下文。

假设您在数据库中有Movie,MusicDirector和Director,并且它们之间的关系是Director& MusicDirector可以指导多部电影,而电影只能有一部导演和MusicDirector。由于我是新用户而无法发布图像,因此这是我的数据库结构。

电影桌有MovieId,Name,MusicDirectorId,DirectorId

Director表有DirectorId,Name

MusicDirector表有MusicDirectorId,名称

这是图表的链接。 http://i.stack.imgur.com/ce49r.png

我正在尝试插入新电影,导演和音乐导演“已经存在”在数据库中。以下是我的代码。

Movie movie = new Movie();            
        movie.Name = "Movie1";
        movie.Director = new Director() { Name = "DirectorA" };           
        movie.MusicDirector = new MusicDirector() { Name = "MusicDirectorA" };

        using (TestEFEntities ctx = new TestEFEntities())
        {
            movie.Director = ctx.Directors.Where(x => x.Name == movie.Director.Name).FirstOrDefault();
            movie.MusicDirector = ctx.MusicDirectors.Where(x => x.Name == movie.MusicDirector.Name).FirstOrDefault();                                    
            ctx.Movies.AddObject(movie);                    
            ctx.SaveChanges();
        }

现在,当我这样做时,即使它被数据库中的记录覆盖,也会再次添加MusicDirector记录。你可能会想为什么我要保留这部电影.Director = new Director(){Name =“DirectorA”};最初,它是一个Asp.net MVC应用程序,其中Movie对象与用户添加的director和musicdirector名称绑定。因此,前4行由MVC隐式完成,并认为所有其他行都在服务层中。我错过了什么,因为这是一个非常基本的场景,框架应该处理它?当然,解决这个问题的一个解决方案是创建一个新的Movie对象并从db中分配我不想做的记录,因为我必须从控制器发送的影片对象中复制所有属性。我怎么解决这个问题?

这也适用于自我追踪实体。这是对POCO的某种限制吗?如果有人可以解释这种行为会很好吗?

1 个答案:

答案 0 :(得分:0)

如果您正在使用POCO,那么您的代码应该按照您的预期方式工作。或者,您可以尝试填充FK,而不是像这样分配整个对象:

using (TestEFEntities ctx = new TestEFEntities())
{
    movie.DirectorID = ctx.Directors
        .Where(x => x.Name == movie.Director.Name).First().DirectorID;

    movie.MusicDirectorID = ctx.MusicDirectors
        .Where(x => x.Name == movie.MusicDirector.Name).First().MusicDirectorID;

    ctx.Movies.AddObject(movie);                    
    ctx.SaveChanges();
}