EF 4.1, наследование и ассоциация общего первичного ключа => Тип результата указанного выражения несовместим

Сводка

У меня есть три класса:

  • Учетная запись
  • SpecialAccount (наследуется от Учетная запись )
  • Профиль (0 .. 1 отношение к SpecialAccount )

Другими словами, SpecialAccount может иметь 0 или 1 профилей . Профиль должен иметь SpecialAccount .

В EF это можно настроить только как отношение общего первичного ключа.

При запросе профиля ] и спрашивая о материалах из SpecialAccount (например, "найти профили, где profile.SpecialAccount.Name ==" бла "), я получаю эту ошибку:

{" The ResultType указанного выражения несовместим с требуемым типом.
Выражение ResultType - «Transient.reference [EFInheritanceTest.Account]», но
требуемый тип - Transient.reference [EFInheritanceTest.SpecialAccount].
\ r \ nИмя параметра: arguments 1 "}

Подробности

Этот код иллюстрирует проблему:

namespace EFInheritanceTest
{
  class Program
  {
      static void Main(string[] args)
      {
         using (var context = new MyContext())
         {
            var t = context.Profiles.Where(p => p.SpecialAccount.Name == "Fred");
            Console.WriteLine(t.Count());

            Console.ReadKey();
         }
      }
  }

  public class MyContext : DbContext
  {
     public DbSet Accounts { get; set; }
     public DbSet SpecialAccounts { get; set; }
     public DbSet Profiles { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
         base.OnModelCreating(modelBuilder);

         modelBuilder.Entity().HasOptional(a => a.Profile);
         modelBuilder.Entity().HasRequired(p => p.SpecialAccount);
     }
  }

 public class Account
 {
     public int ID { get; set; }
     public string Name { get; set; }
 }

 public class SpecialAccount : Account
 {
      public virtual Profile Profile { get; set; }
 }

 public class Profile
 {
     public int ID { get; set; }
     public string Summary { get; set; }
     public virtual SpecialAccount SpecialAccount { get; set; }
 }
}

Проведенные на данный момент исследования

По сути, виновником является ассоциация общего первичного ключа ; Когда профиль ищет свой SpecialAccount , он вместо этого получает родительский объект Account .

Единственное решение, которое я вижу, - это изменить его как итак;

public class SpecialAccount : Account
{
    public virtual ICollection Profiles { get; set; }
}

и поддерживайте правила в коде, а не в базе данных. Но это просто некрасиво.

Я нашел этот связанный вопрос и эту ошибку в Connect - но это был отмечен как устраненный!?

Я подозреваю, что это ошибка в EF4.1, но если кто-нибудь знает что-нибудь получше или способ ее решения, я был бы очень благодарен за любые идеи.

5
задан Community 23 May 2017 в 12:11
поделиться