Влияние на именование столбцов внешнего ключа в коде EF в первую очередь (CTP5)

У меня есть класс POCO, который имеет два односторонних унарных отношения с другим классом, оба класса имеют общего предка. Имена внешних ключей в сгенерированной схеме не отражают имена свойств. (Свойства MainContact и FinancialContact дают имена полей PersonId и PersonId1.)

Как я могу повлиять на создание схемы, чтобы сгенерировать имена столбцов базы данных, которые соответствуют именам свойств?

Модель выглядит так:

The class model

Код выглядит следующим образом :

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; }
}

Схема выглядит так: enter image description here

Ответ druttka


приведенный ниже ответ 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; }
}

Что дает гораздо более подходящую базу данных: enter image description here

15
задан Sean Kearon 24 February 2011 в 08:45
поделиться