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