我的问题最好通过示例代码来解释。我使用默认情况下由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的某种限制吗?如果有人可以解释这种行为,那将会很棒?
我正在使用POCO,因此没有DirectorReference属性。 – Jonna 2010-11-12 17:32:47
是的,对不起,你提到过,我没有注意到。那么如何像我在更新后的答案中描述的那样填充FK? – 2010-11-12 18:12:45
如何在EF CTP 5中使用DbContext并使用“Ado.net DbContext生成器”来执行此操作?没有修正代码,因此设置DirectorId不会清除Director。将DirectorId设置为唯一选项后,总是设置movie.Director = null? – Jonna 2011-01-28 18:14:43