Сводка
У меня есть три класса:
Учетная запись
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, но если кто-нибудь знает что-нибудь получше или способ ее решения, я был бы очень благодарен за любые идеи.