【问题标题】:Oracle ODP.Net and EF CodeFirst - SaveChanges ErrorOracle ODP.Net 和 EF CodeFirst - SaveChanges 错误
【发布时间】:2012-04-13 09:38:12
【问题描述】:

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

代码:

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 调用保存多个更改,所以我想知道这里出了什么问题。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 嗨,马特,感谢您的回答。但是,是的,角色已经存在于数据库中。但是让我们假设它是新的(当然有一个 diff Id)并且我使用 Add 方法而不是 Attach,我得到了同样的错误。一般来说,这种情况总是发生,我尝试通过单个 SaveChanges 调用添加(或更新)多个相关实体。
    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多