0

У меня есть TPH базовый класс, PayCaddyMessage, сконфигурированные как показано ниже в моем коде, первая модель:Повторяющиеся имена свойств, затрудняющие EF Миграции

sealed class PayCaddyMessageConfig : PayCaddyEntityConfig<PayCaddyMessage> 
{ 
    public PayCaddyMessageConfig() 
    { 
     Property(e => e.Subject) 
      .IsRequired() 
      .HasMaxLength(50); 
     HasRequired(e => e.Sender); 
     HasRequired(e => e.Receiver); 
    } 
} 

У меня есть класс, производный от PayCaddyMessage:

public class PayBetRequest: PayCaddyMessage 
{ 
    public string SenderId { get; set; } 
    public string ReceiverId { get; set; } 
    public string Description { get; set; } 
    public int Amount { get; set; } 
    public bool PaymentAccepted { get; set; } 
} 

}

Я удалил свою старую базу данных и пытаюсь запустить новую, используя Migrations. Когда я выполняю команду Add-Migration Create -Force, я получаю исключение, со следующей информацией:

System.Data.Entity.ModelConfiguration.ModelValidationException: One or more validation errors were detected during model generation: 

ReceiverId: Name: Each property name in a type must be unique. Property name 'ReceiverId' is already defined. 
SenderId: Name: Each property name in a type must be unique. Property name 'SenderId' is already defined. 

Я не могу найти дубликаты имен свойств в моем коде. Duh, это не скомпилировалось, но я сильно подозреваю, что EF добавляет свойства SenderId и ReceiverId в PayBetRequest в качестве внешних ключей, хотя они явно не объявлены в этом классе, а затем производный класс PayBetRequest объявляет эти свойства. Затем в классе, созданном для миграции, я получаю дубликаты имен свойств.

Если я опускаю эти разновидности из производного класса, они не будут доступны в моем коде, поскольку они не объявлены в базовом типе, и я не знаю, как объявить их как внешние ключи на базе типа, поэтому я опустил их там, и HasRequired(e => e.Sender); автоматически генерирует SenderId в процессе миграции.

+0

Я не понимаю, почему вы можете иметь 'Sender' и' Receiver' в базовых типах, но не их свойства внешнего ключа. Если вы получаете доступ к 'Sender', вы косвенно получаете доступ к его внешнему ключу, поэтому он может также быть свойством базового типа. Или вы не знаете, как определить отображение? –

+0

Я удалил свойства 'Id' для производного класса. Он имеет доступ к 'Sender' своей базы, а также к' Sender.Id'. Сделайте это ответом, и я соглашусь. – ProfK

ответ

0

Sender и Receiver являются частью базового типа, что означает, что базовый тип косвенно имеет доступ к их внешним ключам. Таким образом, эти FKS могут также быть частью базового типа:

public PayCaddyMessageConfig() 
{ 
    Property(e => e.Subject) 
     .IsRequired() 
     .HasMaxLength(50); 
    HasRequired(e => e.Sender).WithMany().HasForeignKey(p => p.SenderId); 
    HasRequired(e => e.Receiver).WithMany().HasForeignKey(p => p.ReceiverId); 
} 

Или, как вы говорите, в комментарий, вы можете удалить внешние ключевые свойства в целом. Если вам нужен Id в производном классе, вы можете получить к нему доступ, например. Sender.Id.

Помните, что удаление свойств внешнего ключа из модели превращает ассоциации в independent associations in stead of foreign key associations.

Смежные вопросы