У меня есть 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
в процессе миграции.
Я не понимаю, почему вы можете иметь 'Sender' и' Receiver' в базовых типах, но не их свойства внешнего ключа. Если вы получаете доступ к 'Sender', вы косвенно получаете доступ к его внешнему ключу, поэтому он может также быть свойством базового типа. Или вы не знаете, как определить отображение? –
Я удалил свойства 'Id' для производного класса. Он имеет доступ к 'Sender' своей базы, а также к' Sender.Id'. Сделайте это ответом, и я соглашусь. – ProfK