AddingandUpdatingEntitiesUsingEntityFramework在我的上一个项目中,我使用了EntityFramework5CodeFirst。我已经完成了我的项目,但我在开发过程中遇到了很多痛苦。我试着解释下面的痛苦:我的数据访问逻辑层有几个数据类,如Product、ProductCategory、Order、Company、Manufacturer等......每个类都有对其他一些类的引用。例如,Product实例具有ProductCategory属性。在我的数据访问对象类的Add和Update方法中,我将上下文中每个属性(原始类型除外)的状态设置为Unchanged或Modified。下面是部分dao类的update方法:context.Entry(entity).State=System.Data.EntityState.Modified;如果(entity.Category!=null)context.Entry(entity.Category).State=System.数据.EntityState.Unchanged;如果(entity.Manufacturer!=null)context.Entry(entity.Manufacturer).State=System.Data.EntityState.Unchanged;foreach(varspecificationDefinitioninentity.SpecificationDefinitions){context.Entry(specificationDefinition).State=System.Data.EntityState.Unchanged;foreach(varspecificationValueinspecificationDefinition.Values){context.Entry(specificationValue).State=System.Data.EntityState.Unchanged;这段代码看起来像这样。我的一些添加或更新方法大约有30行代码。我想我做错了什么,添加或更新实体不应该这么痛苦但是当我不设置对象的状态时,我要么在数据库中得到异常要么重复条目。我真的必须设置映射到数据库的每个属性的状态吗?您可以将代码替换为:context.Products.Attach(entity);context.Entry(entity).State=System.Data.EntityState.Modified;这是相同的(除非相关实体已经附加到Context中的另一个状态,而不是像以前一样的Unchanged)因为Attach将包含对象图中所有相关实体的实体放入状态Unchanged的??上下文中。之后将实体的状态设置为已修改只会将产品(而非相关实体)的状态从未更改更改为已修改。好的,那你只是做错了。除了我的评论之外,我还为您创建了一个示例,表明默认情况下EF不会创建重复项。我有两个类:publicclassProduct{publicintId{get;放;}公共字符串名称{得到;放;}publicProductCategory类别{get;放;}publicdecimalPrice{get;放;}}publicclassProductCategory}publicstringName{get;放;}}上下文:publicclassMyContext:DbContext{publicDbSetProducts{get;放;}publicDbSetProductCategories{get;放;}publicMyContext():base("name=MyContext"){}publicMyContext(stringnameOrConnectionString):base(nameOrConnectionString){}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){Database.SetInitializer(null);//表映射modelBuilder.Entity().ToTable("Product");modelBuilder.Entity().ToTable("ProductCategory");base.OnModelCreating(模型构建器);}}然后是一个初始化类(如果需要可以继承其他策略):uctCategory(){名称="类别1"};varprod=newProduct(){Name="Product1",Category=prodCat,Price=19.95M};使用(varcontext=newMyContext()){varinitializer=newInitDb();initializer.InitializeDatabase(上下文);Console.WriteLine("将产品和类别添加到上下文中。");context.ProductCategories.Add(prodCat);context.Products.Add(产品);控制台.WriteLine();Console.WriteLine("正在保存初始上下文。");context.SaveChanges();Console.WriteLine("上下文已保存。");控制台.WriteLine();Console.WriteLine("更改产品详情。");varinitProd=context.Products.Include(x=>x.Category).SingleOrDefault(x=>x.Id==1);打印产品(initProd);initProd.Name="产品1已修改";initProd.Price=29.95M;initProd.Category.Name="类别1已修改";打印产品(initProd);控制台.WriteLine();Console.WriteLine("保存修改后的上下文。");context.SaveChanges();Console.WriteLine("上下文已保存。");控制台.WriteLine();Console.WriteLine("从数据库中获取修改后的产品。");varmodProd=context.Products.Include(x=>x.Category).SingleOrDefault(x=>x.Id==1);打印产品(modProd);控制台.WriteLine();Console.WriteLine("完成!");控制台.ReadKey();}}staticvoidPrintProduct(Productprod){Console.WriteLine(newstring('-',10));Console.WriteLine("Id:{0}",prod.Id);Console.WriteLine("姓名:{0}",prod.Name);Console.WriteLine("价格:{0}",prod.Price);Console.WriteLine("CatId:{0}",prod.Category.Id);Console.WriteLine("CatName:{0}",prod.Category.Name);Console.WriteLine(新字符串('-',10));}这导致以下控制台输出:将产品和类别添加到上下文中。保存初始上下文。上下文已保存。更改产品详细信息。----------ID:1名称:产品1价格:19,95CatId:1CatName:类别1--------------------Id:1Name:Product1modifiedPrice:29,95CatId:1CatName:Category1modified----------保存修改后的上下文上下文已保存。从数据库中获取修改后的产品。----------Id:1Name:Product1modifiedPrice:29,95CatId:1CatName:Category1modified---------完成!此外,在查看SQLServerManagementStudio时,此解决方案仅创建(和更新)一个产品和一个类别。当然,您应该使用存储库来检索、更新和删除数据和工作单元。这些已从示例中排除。所以,如果你不贴任何代码,我们帮不了你更多:-)以上就是关于C#学习教程:使用实体框架添加和更新实体分享,如果对大家有用需要了解的话更多关于C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
