2

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

编码:

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

我想要做的是保存一个具有现有角色的新用户。User 和 Role 类具有 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 调用保存多个更改,所以我想知道这里有什么问题。

4

1 回答 1

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()应该在这里工作得很好。

于 2012-03-30T19:15:30.297 回答