如果我有以下型号:
[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
}
实体框架正确使用Person
和Address
表名,但Address
中的外键称为PersonDao_Id
。我希望它是Person_Id
。
这是一个错误还是我应该为属性名称编写自定义约定?
注意:我使用MySQL和Entity Framework,我不知道这是否重要。
编辑:我知道我可以使用ForeignKey
属性或流畅的API手动指定列名。我需要它自动和全局工作。
答案 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");