在Code First EF中将N重命名为N表

时间:2013-06-03 12:48:41

标签: c# entity-framework ef-code-first

我有两个连接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

有没有办法将RoleUsers重命名为Backoffice_RoleUsers

我尝试在迁移文件中手动重命名表,但它会出现此错误:

  

System.Data.Entity.Infrastructure.DbUpdateException:发生错误   同时保存不公开外键属性的实体   他们的关系。 EntityEntries属性将返回null   因为单个实体不能被识别为   例外。保存时可以更轻松地处理异常   在您的实体类型中公开外键属性。见   InnerException以获取详细信息。 ---&GT;   System.Data.Entity.Core.UpdateException:发生错误   更新条目。有关详细信息,请参阅内部异常---&GT;   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);

}

1 个答案:

答案 0 :(得分:2)

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

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

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