2010-11-12 193 views
1

我的问题最好通过示例代码来解释。我使用默认情况下由C#POCO生成器生成的更改跟踪代理使用POCO。请看下面。使用外键的实体框架POCO

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

电影表有MovieId,名称,MusicDirectorId,DirectorId

主任表已经DirectorId,名称

MusicDirector表已经MusicDirectorId,名称

这里是链接到图中。 http://i.stack.imgur.com/ce49r.png

我想插入一个新的电影和导演和musicdirector“已经存在”在分贝。以下是我的代码。

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

此功能在自我追踪实体中正常工作。这是对POCO的某种限制吗?如果有人可以解释这种行为,那将会很棒?

回答

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(); 
} 
+0

我正在使用POCO,因此没有DirectorReference属性。 – Jonna 2010-11-12 17:32:47

+0

是的,对不起,你提到过,我没有注意到。那么如何像我在更新后的答案中描述的那样填充FK? – 2010-11-12 18:12:45

+0

如何在EF CTP 5中使用DbContext并使用“Ado.net DbContext生成器”来执行此操作?没有修正代码,因此设置DirectorId不会清除Director。将DirectorId设置为唯一选项后,总是设置movie.Director = null? – Jonna 2011-01-28 18:14:43