Oracle ODP.Net和EF CodeFirst – SaveChanges错误

有人可以帮我这个:

代码:

Role r = new Role { ID = 1, Name = "Members" }; ctx.Roles.Attach(r); //Saving User User u = new User { Login = login, Password = password, Status = 1 }; u.Roles.Add(r); ctx.Users.Add(u); ctx.SaveChanges(); 

我要做的是保存具有现有角色的新用户。 用户和角色类具有由fluent-api映射的多对多关系,如下所示:

 modelBuilder.Entity() .HasMany(u => u.Roles) .WithMany(r => r.Users) .Map(x => { x.ToTable("USER_ROLE_XREF", dbsch); x.MapLeftKey("ID_USER"); x.MapRightKey("ID_ROLE"); }); 

但是当调用SaveChanges时,我收到此错误: {“指定的值不是’Edm.Decimal’类型的实例’\ r \ nParameter name:value”}

实际上,我总是尝试使用单个SaveChanges()调用保存相关实体我得到相同的错误。 所以,我必须做的就是做多次调用,所以效果很好:

 Role r = new Role { ID = 1, Name = "Members" }; ctx.Roles.Attach(r); //Saving User User u = new User { Login = login, Password = password, Status = 1 }; ctx.Users.Add(u); ctx.SaveChanges(); //Assigning Member Role u.Roles.Add(r); ctx.SaveChanges(); 

我的理解是EF支持通过单个SaveChanges调用来保存多个更改,所以我想知道这里有什么问题。

使用Attach()方法的想法是,您有一个已知在数据库中但未被此上下文跟踪的实体,对吧? 我的问题是你确定这个角色在这里:

 Role r = new Role { ID = 1, Name = "Members" }; 

已存在的东西? 如果没有,我不认为你想要做的就是使用

 ctx.Roles.Attach(r); 

而是你写的:

 ctx.Roles.Add(r); 

然后你可以转身写

 User u = new User { Login = login, Password = password, Status = 1, }; ctx.Users.Add(u); u.Roles.Add(r); ctx.SaveChanges(); 

你的第一个例子的问题是这个新角色对数据库来说是新的,所以附加它不是你想要做的,而是你想要添加它。

ctx.SaveChanges()应该可以正常工作。