版权声明:本文为博主原创文章,未经博主允许不得转载。如果感觉文章哪里写的不对或者存在疑问,欢迎留言,共同学习、进步! https://blog.csdn.net/ydm19891101/article/details/43984367
最近在开发一个项目,在实现某个模块数据的插入操作时(底层数据库的交互采用的是EF),发现无论如何数据都不能插入成功,把数据拷贝出来放到数据库中执行Sql语句时却能正确插入,下面给出代码片段
public int InsertWithFundInfo(F_WithFunding_Info withinfo) { int res = 0; using (var context = new RenRenChaoContext()) { context.F_WithFunding_Info.Attach(withinfo); return res = context.SaveChanges(); } }核心也就是两段代码,就是不知道问题出在了哪里。后来想起EF插入数据还有一个Add方法,于是抱着侥幸的心理试了试,结果竟然成功了。
public int InsertWithFundInfo(F_WithFunding_Info withinfo) { int res = 0; using (var context = new RenRenChaoContext()) { context.F_WithFunding_Info.Add(withinfo); //context.F_WithFunding_Info.Attach(withinfo); return res = context.SaveChanges(); }
在网上搜了一番,发现虽然两者都可以用来插入数据,不过还是有一些细微的差别。
在讲解差别之前,我们先来看下命名空间下的描述实体所处状态的枚举类型EntityState:
// 摘要: //实体对象的状态。 [Flags] public enum EntityState { // 摘要: // 对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态。通过调用 System.Data.Objects.ObjectContext.Detach(System.Object) // 方法从上下文中移除实体后,或者使用 System.Data.Objects.MergeOption.NoTrackingSystem.Data.Objects.MergeOption // 加载实体后,该实体也会处于此状态。 Detached = 1, // // 摘要: // 自对象加载到上下文中后,或自上次调用 System.Data.Objects.ObjectContext.SaveChanges() 方法后,此对象尚未经过修改。 Unchanged = 2, // // 摘要: // 对象已添加到对象上下文,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。对象是通过调用 // System.Data.Objects.ObjectContext.AddObject(System.String,System.Object) // 方法添加到对象上下文中的。 Added = 4, // // 摘要: // 使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法从对象上下文中删除了对象。 Deleted = 8, // // 摘要: // 对象已更改,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。 Modified = 16, }
context.ObjectStateManager.ChangeObjectState(withinfo,EntityState.Added);
调用Add()方法时其实已经隐藏了修改实体的状态为Added的这个操作,执行SaveChange()方法就可以进行新增的操作。
在 Linq to EF 增删改查这篇文章中添加数据介绍了两种方法的具体使用有兴趣的可以参考一下。
参考文献:https://msdn.microsoft.com/zh-cn/library/system.data.objects.objectcontext.attach(v=vs.110).aspx
https://msdn.microsoft.com/zh-cn/library/system.data.objects.objectcontext.addobject(v=vs.110).aspx
https://msdn.microsoft.com/zh-cn/library/bb351713(v=vs.110).aspx
http://www.cnblogs.com/Jnw-qianxi/archive/2013/08/15/3260989.html
---------------------
作者:躬行者
来源:CSDN
原文:https://blog.csdn.net/ydm19891101/article/details/43984367
版权声明:本文为博主原创文章,转载请附上博文链接!