【问题标题】:Fluent API Many to Many Mapping ErrorFluent API 多对多映射错误
【发布时间】:2023-04-01 12:44:01
【问题描述】:

我有以下映射来支持多对多表 (User_Role)

     modelBuilder.Entity<Role>()
        .HasMany<User>(u => u.users)
        .WithMany(r => r.roles)
        .Map(m => 
           m.MapLeftKey("role_id")
           m.MapRightKey("user_id")
           m.ToTable("User_Role"));

这非常适用于将多个角色映射到一个用户以及将多个用户映射到一个角色。我遇到的问题是当我需要通过如下实体向表 User_Role 添加新行时:

public class User_Role
{
   [Key Column(Order=1)]   
   public int role_id {get;set;)
   [Key Column(Order=1)]
   public int user_id {get;set;)
}

每当我尝试按如下方式访问此实体时:

 dbContext.User_Role.Add(new User_Role {user_id ....

EF 寻找一个不存在的名为 User_Role1 的表...它在表名中添加了一个“1”。

然后我尝试添加:

  [Table("User_Role")] 

这会处理添加“1”,但我现在收到此错误:

“已经定义了架构‘dbo’和表‘User_Role’的EntitySet‘RoleUser’。每个EntitySet必须引用一个唯一的架构和表”

我能够确认以下几行一起导致了问题,但我有点需要它们

 m.ToTable("User_Role") and public class User_Role..

任何建议都会很棒......我很难过。

【问题讨论】:

    标签: orm entity-framework-4 mapping fluent-interface


    【解决方案1】:

    您不能通过模型​​中的实体类来表示多对多关系中的连接表。此连接表由 EF 管理,您无法直接访问此表。如果您想在现有用户和现有角色之间创建关系,您必须使用以下两个实体来执行此操作:

    var user = dbContext.Users.Single(u => u.id == user_id);
    var role = dbContext.Roles.Single(r => r.id == role_id);
    
    // if you don't have lazy loading and don't instantiate the collection
    // in the constructor, add this: user.roles = new List<Role>(); 
    
    user.roles.Add(role);
    
    dbContext.SaveChanges();
    

    这会将新关系((user_id,role_id) 对)的条目写入连接表。

    编辑

    如果您手头只有两个关键属性并且不想从数据库加载用户和角色,您可以使用附加的“存根实体”:

    var user = new User { id = user_id, roles = new List<Role>() };
    var role = new Role { id = role_id };
    
    dbContext.Users.Attach(user);
    dbContext.Roles.Attach(role);
    
    user.roles.Add(role);
    
    dbContext.SaveChanges();
    

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多