首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF 4.1,继承和共享主键关联=>指定表达式的ResultType不兼容

EF 4.1,继承和共享主键关联=>指定表达式的ResultType不兼容
EN

Stack Overflow用户
提问于 2011-07-11 10:42:05
回答 1查看 1.1K关注 0票数 5

摘要

我有三门课:

  • Account
  • SpecialAccount (继承自Account)
  • Profile (0..1与SpecialAccount的关系)

换句话说,SpecialAccount可以有0或1 ProfilesProfile必须有一个SpecialAccount

在EF中,只能将其设置为共享的主键关系。

当查询profile并询问来自SpecialAccount的内容时(例如,“在profile.SpecialAccount.Name == "blah"中查找概要文件”),我会得到以下错误:

{“指定表达式的ResultType与所需类型不兼容。 表达式'Transient.referenceEFInheritanceTest.Account‘是ResultType,但是 所需的类型是'Transient.referenceEFInheritanceTest.SpecialAccount'. \r\n参数名称:参数1“}

详细信息

这段代码说明了这个问题:

代码语言:javascript
复制
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<Account> Accounts { get; set; }
     public DbSet<SpecialAccount> SpecialAccounts { get; set; }
     public DbSet<Profile> Profiles { get; set; }

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

         modelBuilder.Entity<SpecialAccount>().HasOptional(a => a.Profile);
         modelBuilder.Entity<Profile>().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; }
 }
}

调查到目前为止

基本上,罪魁祸首似乎是共享的主键关联;当Profile去寻找它的SpecialAccount时,它反而得到了父Account对象。

我能看到的唯一解决办法就是这样改变它;

代码语言:javascript
复制
public class SpecialAccount : Account
{
    public virtual ICollection<Profile> Profiles { get; set; }
}

并在代码中维护规则,而不是使用数据库。但这很难看。

我在Connect上找到了这个相关的问题这只虫子 --但是它被标记为解决了!?

我怀疑这是EF4.1中的一个bug,但如果有人知道更好的方法或绕过它,那么我将非常感谢您的任何见解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-11 13:33:55

作为一种不改变模型定义的解决方法,您可以使用一个联接:

代码语言:javascript
复制
var t = from p in context.Profiles
        join s in context.SpecialAccounts
          on p.ID equals s.ID
        where s.Name == "Fred"
        select p;
var count = t.Count();

或者使用扩展方法:

代码语言:javascript
复制
var t = context.Profiles
               .Join(context.SpecialAccounts,
                     p => p.ID,
                     s => s.ID,
                     (p, s) => new { s, p })
               .Where(r => r.s.Name == "Fred");
var count = t.Count();

这不是很好,但在我看来,您的原始查询不起作用这一事实看上去确实像个bug。(我用EF 4.1测试过)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6648895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档