Oracle ODP.Net和EF CodeFirst - SaveChanges错误

时间:2012-03-29 17:37:01

标签: c# oracle ef-code-first odp.net entity-framework-4.3

有人可以帮我解决这个问题:

代码:

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 \参数名称:值”}

实际上,我总是尝试使用单个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调用保存多个更改,所以我想知道这里有什么问题。

1 个答案:

答案 0 :(得分:0)

使用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()的单次调用在这里应该可以正常工作。