如何告诉EF使用哪个链接表?

时间:2016-11-23 16:41:15

标签: c# entity-framework

我将EntityFramework与链接表一起使用,并创建了一个OnModelCreating,它创建了一个名为" RolePrivileges"的链接表。但我有另一个dbcontext使用相同的数据库,但与另一种方式的关系,所以我得到这个错误:
Invalid object name 'dbo.PrivilegeRoles'

我的Privilege类有public virtual ICollection<Role> Roles { get; set; }属性。

我怎样才能告诉EF它来自RolePrivileges而不是PrivilegeRoles?

更新

我添加了一些代码,这是一个大项目,我正在使用存储库模式和所有这些。这只是为了显示错误

我有很多项目,一个只用于生成包含所有实体,迁移和所有这些的数据库。

在这个项目的dbcontext中我有

public class EasyhoursDbContext : IdentityDbContext<ApplicationUser>
{
    ...
    public DbSet<Role> AccessRoles { get; set; }
    public DbSet<Privilege> Privileges { get; set; }
    ...
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        ...
        modelBuilder.Entity<Role>()
            .HasMany(role => role.Privileges)
            .WithMany(p => p.AccessRoles)
            .Map(ap =>
            {
                ap.MapLeftKey("RoleId");
                ap.MapRightKey("PrivilegeId");
                ap.ToTable("RolePrivileges");
            });
        ...
    }
}

public class Role
{
    [Key]
    public string Id { get; protected set; }
    public string Name { get; protected set; }
    public virtual List<Privilege> Privileges { get; private set; } 
}

public class Privilege
{
    [Key]
    public string Id { get; set; }
    ...
    public virtual ICollection<Role> AccessRoles { get; set; }
}

然后在另一个项目中,我有一个只包含此

的dbcontext
public class RoleDbContext : DbContext
{
    public RoleDbContext()
        : base("DefaultConnection")
    {
    }

    public DbSet<Role> AccessRoles { get; set; }

    public DbSet<Privilege> Privileges { get; set; }
}

public class Privilege
{
    public string Id { get; set; }

    ...

    [JsonIgnore]
    [IgnoreDataMember]
    public virtual ICollection<Role> AccessRoles { get; set; }
}

public class Role
{
    public string Id { get; protected set; }

    public string Name { get; protected set; }

    public List<Privilege> Privileges { get; set; } = new List<Privilege>();
}

以下是我收到错误的示例:

var db = new RoleDbContext();

var role = db.AccessRoles.FirstOrDefault(r => true);
var privilege = db.Privileges.FirstOrDefault(p => true);

role.Privileges.Add(privilege);

db.Entry(role).State = EntityState.Modified;
db.SaveChanges();

在保存更改时,我收到错误:

enter image description here

运行这个完全相同的代码,但使用EasyhoursDbContext,它可以正常工作

更新

我现在更新了RoleDbContext,以包含与onhodelcreation完全相同的规则,如EasyhoursDbContext。

但是现在我收到了这个错误: Violation of PRIMARY KEY constraint 'PK_dbo.RolePrivileges'. Cannot insert duplicate key in object 'dbo.RolePrivileges'. The duplicate key value is (03fd67b6-277f-43f6-b276-5bafbdbe55af, A657a693-0961-Role-b86b-381261aApply).\r\nThe statement has been terminated.

1 个答案:

答案 0 :(得分:0)

我想感谢Steve Greene帮助我找到问题。

我只需要将OnModelCreation添加到我的RolesDbContext

modelBuilder.Entity<Role>()
    .HasMany(role => role.Privileges)
    .WithMany(p => p.AccessRoles)
    .Map(ap =>
    {
         ap.MapLeftKey("RoleId");
         ap.MapRightKey("PrivilegeId");
         ap.ToTable("RolePrivileges");
    });