我将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; }
}
然后在另一个项目中,我有一个只包含此
的dbcontextpublic 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();
在保存更改时,我收到错误:
运行这个完全相同的代码,但使用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.
答案 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");
});