您的位置:首页 > 博客中心 > 数据库 >

EF为什么向我的数据库再次插入已有对象?(ZT)

时间:2022-03-10 16:57

最近做了个多对多对实体对象,结果发现每次只要增加一个子实体,就会自动添加一个父实体进去,而不管该父实体是否已经存在.

找了好久,终于找到这篇文章,照文章内容来看,应该是断开连接导致的.

------------------------------------------------------------------------------

在为本期专栏的主题构思的时候,有三位朋友通过 twitter 和邮件问我,实体框架为什么向他们的数据库再次插入已有对象。

 看来,我不用为本期专栏写什么而头疼了。        

由于实体框架具有状态管理能力,因此当它处理图形时,其实体状态行为并不总是符合你的期望。 

我们来看一个典型示例。        

假定有两个类:Screencast 和 Topic 类,且为每个 Screencast 对象分配一个 Topic 对象,如图 1 所示。        

图 1 Screencast 和 Topic 类                       

          

gxlsystem.com,布布扣           图 2 用来输入新 Screencast 对象的 Windows Presentation Foundation 表单                   

然后,在客户端应用程序中(如图 2 所示的 WPF 表单),将下拉列表中选定的条目赋给新 Screencast 对象的 Topic 属性,代码如下:        

gxlsystem.com,布布扣          

 

图 4 新的 Screencast 从匹配的 HttpRequest 查询字符串值来获取其 TopicId 值             

      

为了检验这一点,你可以将控制器的 TopicId 变量改为其他名字,例如 TopicIdX,然后在视图的 @Html.DropDownList 中对“TopicId”字符串作同样修改,则查询字符串值(现在是 TopicIdX)将被忽略,screencast.TopicId 的值将为 0。        

这时,将不会有 Topic 实例通过管道传递回来。          

因此 ASP.NET MVC 默认根据外键属性,从而避免了向数据库重复插入已有的 Topic。        

 

这不是你的错!          

断开连接的图形太复杂了      

  

尽管实体框架的开发团队在一版又一版的更新升级中做了大量工作,使断开连接的数据处理起来更容易,但它仍然是个让许多并不熟知实体框架预期行为的开发者为之气馁的问题。          

在 Rowan Miller 和我共同编著的《Programming Entity Framework: DbContext》(实体框架编程:DbContext)一书(O‘ Reilly Media,2012)中,我们花了一整章讨论断开连接的实体和图形。           而且在制作近期的一集 Pluralsight 课程时,我额外增加了 25 分钟的时间,专门讲解断开连接的图形在存储库中的复杂性。        

用图形进行数据查询和交互是非常方便的,但要建立图形与现有数据的关系时,外键是不可或缺的朋友!          

请查阅我在 2012 年 1 月的专栏文章“设法应对缺少的外键”(msdn.microsoft.com/magazine/hh708747),其中也讨论了不用外键的一些编程陷阱。        

在下一期专栏文章中,我将继续探索如何减轻开发者在断开连接的场景中与图形打交道所遇到的痛苦。          

那期专栏是本主题的第二部分,将集中讨论如何在多对多关系和导航集合中对 EntityState 进行控制。        

 

Julie Lerman                    

是 Microsoft MVP、.NET 导师和顾问,住在佛蒙特州的山区。 您可以在全球的用户组和会议中看到她对数据访问和其他 Microsoft .NET 主题的演示。 她是《Programming Entity Framework》(2010) 以及“代码优先”版 (2011) 和 DbContext 版 (2012)(均出自 O’Reilly Media)的作者,博客网址为 thedatafarm.com/blog。 请关注她的 Twitter:twitter.com/julielerman。                  

EF为什么向我的数据库再次插入已有对象?(ZT),布布扣,bubuko.com

热门排行

今日推荐

热门手游