Oracle ODP.Net and EF CodeFirst - SaveChanges Error

本文关键字:SaveChanges Error CodeFirst EF ODP Net and Oracle | 更新日期: 2023-09-27 18:29:37

有人能帮我吗:

代码:

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<User>()
.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''n参数名称: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调用保存多个更改,所以我想知道这里出了什么问题。

Oracle ODP.Net and EF CodeFirst - SaveChanges Error

Attach()方法的理念是,您有一个已知在DB中但不被此上下文跟踪的实体,对吧?我想问你的是,你确定这个角色在这里吗:

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();

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

ctx.SaveChanges()的单个调用在这里应该可以正常工作。