Сначала влияет на именование столбцов внешнего ключа в коде EF (CTP5) - PullRequest
15 голосов
/ 22 февраля 2011

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

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

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

The class model

Код выглядит так:

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

Схема выглядит следующим образом: enter image description here

Ответ от 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; }
}

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

1 Ответ

10 голосов
/ 24 февраля 2011

EF Code First по умолчанию использует соглашение о конфигурации. Однако вы можете установить явные альтернативы, переопределив DbContent.OnModelCreating. Много примеров здесь , предоставлено ScottGu.

EDIT

Итак, в CTP5 MapSingleType ушел, как описано здесь . Следующее работает для простых строковых свойств, но не для отношений вашей организации с персоной. Мне любопытно, и я планирую продолжать смотреть на это, но пока, возможно, это поможет вам начать, или кто-то другой может завершить ответ.

public class Person : Customer
{
    [Column(Name="EmailAddress")]
    public string Email { get; set; }
}

РЕДАКТИРОВАТЬ 2

Хорошо, это понятно. Нашел ответ здесь . Отказ от ответственности: я только подтвердил, что схема базы данных создана, как ожидалось. Я не проверял, что данные заполнения или дальнейшие операции CRUD работают должным образом.

public class Organisation : Customer
{
    [Column(Name = "FinancialContact")]
    public int? FinancialContactId { get; set; }
    [ForeignKey("FinancialContactId")]
    public Person FinancialContact { get; set; }
    [Column(Name = "MainContact")]
    public int? MainContactId { get; set; }
    [ForeignKey("MainContactId")]
    public Person MainContact { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...