在命名外键时如何使Entity Framework使用表名而不是类名?

时间:2016-12-27 14:37:18

标签: c# .net entity-framework

如果我有以下型号:

[Table("Person")]
public class PersonDao
{
    public Guid Id { get; set; }
    public ICollection<Address> { get; set; }
    // other properties
}

[Table("Address")]
public class AddressDao
{
    public Guid Id { get; set; }
    public PersonDao Person { get; set; }
    // other properties
}

实体框架正确使用PersonAddress表名,但Address中的外键称为PersonDao_Id。我希望它是Person_Id

这是一个错误还是我应该为属性名称编写自定义约定?

注意:我使用MySQL和Entity Framework,我不知道这是否重要。

编辑:我知道我可以使用ForeignKey属性或流畅的API手动指定列名。我需要它自动和全局工作。

2 个答案:

答案 0 :(得分:2)

使用与您一样的属性,为表和类使用不同的名称:

[Table("Address")]
public class AddressDao
{
    public Guid Id { get; set; }

    [ForeignKey("Person_Id")] 
    public PersonDao Person { get; set; }
    // other properties
}

如果您不想使用默认约定,则可以从类名中删除Dao

public class Person
{
    public Guid Id { get; set; }
    public ICollection<Address> { get; set; }
    // other properties
}

public class Address
{
    public Guid Id { get; set; }
    public Person Person { get; set; }
    // other properties
}

答案 1 :(得分:0)

如果要在数据库中创建自己的列名,可以在数据库上下文中的protected override void OnModelCreating(DbModelBuilder modelBuilder)方法中使用Fluent API。使用列名称添加到DAO类属性。

[Table("Person")]
public class PersonDao
{
    public Guid Id { get; set; }
    public ICollection<Address> Addresses { get; set; }
    // other properties
}

[Table("Address")]
public class AddressDao
{
    public Guid Id { get; set; }
    public Guid MyPersonDaoColumnName { get; set; }
    public PersonDao Person { get; set; }
    // other properties
}

然后在Fluent API中写道:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<AddressDao>().HasRequired(x => x.Person)
                                     .WithMany(x => x.Addresses)
                                     .HasForeignKey(x => x.MyPersonDaoColumnName);
}

但是将Fluent API与Attribute混合起来很难看,所以你还需要:

modelBuilder.Entity<AddressDao>.ToTable("Address");
modelBuilder.Entity<PersonDao>.ToTable("Person");