Как мне разрешить это исключение проверки Entity Framework? - PullRequest
0 голосов
/ 16 мая 2018

Я получаю исключение проверки, которое возникает только во время работы моего веб-приложения, но не при запуске автоматических тестов с использованием MSTest (даже эти тесты используют те же компоненты).

Соответствующий код следует:

public abstract class BaseThing
{
  public int Id {get;set;}
  //other properties
}

public class BaseThingConfig :EntityTypeConfiguration<BaseThing>
{
  ToTable("BaseThingTable");
  HasKey(d=>d.Id);
  Property(d=>d.Id).HasColumnName("SomeId");

  Map<ThingChild1>(d=>d.Requires("ThingType").HasValue(1);
  Map<ThingChild2>(d=>d.Requires("ThingType").HasValue(2);
  Map<ThingChild3>(d=>d.Requires("ThingType").HasValue(3);
}

public class ThingChild1 : BaseThing
{
  public long AggregateRootId {get;set;}
  //other stuff
}

    public class ThingChild1Config : EntityTypeConfiguration<ThingChild1>
    {         
Property(d=>d.AggregateRootId).IsRequired().HasColummName("DifferentId");
    }

//the other two child classes of BaseThing and their configs look similar

public class AggregateRoot
{
  public int Id {get;set;}
  public virtual ICollection<ThingChild1> ThingChildren1 {get; private set;}
  public virtual ICollection<ThingChild2> ThingChildren2 {get; private set;}
  public virtual ICollection<ThingChild2> ThingChildren3 {get; private set;}
}

public class AggregateRootConfig : EntityTypeConfiguration<AggregateRoot>
{
  HasMany(d=>d.ThingChildren1).WithRequired().HasForeignKey(a=>a.AggregateRootId);
  HasMany(d=>d.ThingChildren2).WithRequired().HasForeignKey(a=>a.AggregateRootId);
  HasMany(d=>d.ThingChildren3).WithRequired().HasForeignKey(a=>a.AggregateRootId);
}

Когда я запускаю код, который использует эти классы для возврата экземпляра AggregateRoot из базы данных, используя его идентификатор, все работает нормально.Но когда я запускаю тот же код через наше веб-приложение (которое использует SimpleInjector для включения DbContext в игру), я получаю следующее исключение при переходе к вызову dbContext.AggregateRoots.FirstOrDefault(d=>d.Id=id);

Один или несколькоВо время генерации модели были обнаружены ошибки проверки:

DifferentId:: Нет свойства с именем «DifferentId», определенного в типе, указанном в роли «BaseThing».DifferentId:: Нет свойства с именем «DifferentId», определенного в типе, указанном в роли «BaseThing».

Я попытался переместить это свойство в базовый класс, удалив его издочерние классы, и обновление дочерних классов, но это заставляет другие вещи идти на юг, такие как нарушения FK.Некоторое время я следовал по этому пути, но ничего не смог сделать.

Мы используем EF 6.2.

Если у кого-то есть какие-либо идеи, я бы хотел их услышать.Надеюсь, мой пример кода имеет смысл.Заранее спасибо.

1 Ответ

0 голосов
/ 23 мая 2018

Понял это, и я отчасти смущен решением.Оказывается, два проекта в нашем решении, которые ссылаются на структуру сущностей, не ссылались на одну и ту же версию.Один, который содержит контейнер начальной загрузки IoC, ссылается на 6.0, а другой, содержащий фактические классы, связанные с EF (DbContexts, EntityConfigurations), ссылается на 6.2.Оба читают «6.0.0.0» в ссылочных свойствах, поэтому об этом забывают.Как только я обновил прежний проект до 6.2, проблема ушла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...