1

我有两个将 N 连接到 N 的表:

[Table("Backoffice_Roles")]
public class Role
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid RoleId { get; set; }

    public ICollection<User> Users { get; set; }
}


[Table("Backoffice_Users")]
public class User
{
    // Primary key
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; }

    public ICollection<Role> Roles { get; set; }
}

这一切都很好,它创建了 3 个表Backoffice_RolesBackoffice_UsersRoleUsers.

有没有办法重命名RoleUsersBackoffice_RoleUsers

我尝试在迁移文件中手动重命名表,但它给出了这个错误:

System.Data.Entity.Infrastructure.DbUpdateException:保存不为其关系公开外键属性的实体时发生错误。EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅 InnerException。---> System.Data.Entity.Core.UpdateException:更新条目时出错。有关详细信息,请参阅内部异常。---> System.Data.SqlClient.SqlException:无效的对象名称“dbo.RoleUsers”。

此迁移无需手动更改最后一个表的名称:

public override void Up()
{
    CreateTable(
        "dbo.Backoffice_Users",
        c => new
            {
                UserId = c.Guid(nullable: false, identity: true),
            })
        .PrimaryKey(t => t.UserId);

    CreateTable(
        "dbo.Backoffice_Roles",
        c => new
            {
                RoleId = c.Guid(nullable: false, identity: true),
            })
        .PrimaryKey(t => t.RoleId);

    CreateTable(
        "dbo.RoleUsers",
        c => new
            {
                Role_RoleId = c.Guid(nullable: false),
                User_UserId = c.Guid(nullable: false),
            })
        .PrimaryKey(t => new { t.Role_RoleId, t.User_UserId })
        .ForeignKey("dbo.Backoffice_Roles", t => t.Role_RoleId)
        .ForeignKey("dbo.Backoffice_Users", t => t.User_UserId)
        .Index(t => t.Role_RoleId)
        .Index(t => t.User_UserId);

}
4

1 回答 1

2

使用以下映射为联结表提供名称:

modelBuilder.Entity<Role>()
            .HasMany(r => r.Users)
            .WithMany(u => u.Roles)
            .Map(m => m.ToTable("Backoffice_RoleUsers"));

您可以通过覆盖类的OnModelCreating方法来提供映射DbContext

于 2013-06-03T13:07:35.710 回答