У меня есть класс POCO, который имеет две односторонние унарные отношения с другим классом, оба класса имеют общего предка. Имена внешних ключей в сгенерированной схеме не отражают имена свойств. (Свойства MainContact и FinancialContact дают имена полей PersonId и PersonId1).
Как я могу повлиять на генерацию схемы для генерации имен столбцов базы данных, которые соответствуют именам свойств?
Модель выглядит так:
Код выглядит так:
public class CustomerContext: DbContext
{
public DbSet<Organisation> Organisations { get; set; }
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
DbDatabase.SetInitializer(new DropCreateDatabaseAlways<CustomerContext>());
}
}
public abstract class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Person : Customer
{
public string Email { get; set; }
}
public class Organisation : Customer
{
public Person FinancialContact { get; set; }
public Person MainContact { get; set; }
}
Схема выглядит следующим образом:
Ответ от druttka
Ответ druttka ниже сделал свою работу, и приятно знать, что за этим стоит ошибка CTP5. EF также необходимо указать каскадное поведение, и я использовал свободный API для этого, следуя примеру в ссылке, предоставленной druttka. Еще немного хорошего чтения от Мортезы Манави здесь .
Код теперь такой:
public class CustomerContext : DbContext
{
public DbSet<Organisation> Organisations { get; set; }
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
DbDatabase.SetInitializer(new DropCreateDatabaseAlways<CustomerContext>());
builder.Entity<Organisation>()
.HasRequired(p => p.MainContact)
.WithMany()
.HasForeignKey(p => p.MainContactId)
.WillCascadeOnDelete(false);
builder.Entity<Organisation>()
.Property(p => p.MainContactId)
.HasColumnName("MainContact");
builder.Entity<Organisation>()
.HasRequired(p => p.FinancialContact)
.WithMany()
.HasForeignKey(p => p.FinancialContactId)
.WillCascadeOnDelete(false);
builder.Entity<Organisation>()
.Property(p => p.FinancialContactId)
.HasColumnName("FinancialContact");
}
}
public abstract class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Person : Customer
{
public string Email { get; set; }
}
public class Organisation : Customer
{
public Person FinancialContact { get; set; }
public int FinancialContactId { get; set; }
public Person MainContact { get; set; }
public int MainContactId { get; set; }
}
Который теперь дает гораздо более подходящую базу данных: