2

为了进一步抽象我的存储库层,我尝试遵循此处描述的代码优先方法:http: //msdn.microsoft.com/en-us/magazine/ee236639.aspx

我在 Account 和 Subscription 实体之间存在多对多关系。Navigation 属性存在于指向另一个实体的每个实体上(例如 Account.Subscriptions)。

在我创建自己的模型之前,我使用的是实体生成的模型,下面的工作正常(“db”是实体上下文):

public IQueryable<Account> GetBySubscriptionId(int subId)
{
    return from a in db.Accounts
           where a.Subscriptions.Any(s => s.SubscriptionId == subId)
           select a;
}

现在 Account 的模型如下所示:

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

        // nav properties
        public virtual List<Subscription> Subscriptions { get; set; }
}

当我现在尝试运行相同的 LINQ 查询时,我收到了这个错误:

“LINQ to Entities 不支持指定的类型成员‘订阅’。仅支持初始化程序、实体成员和实体导航属性。”

任何建议都非常感谢。

4

1 回答 1

4

尝试更改签名

        // nav properties 
        public virtual List<Subscription> Subscriptions { get; set; }

        // nav properties 
        public virtual ICollection<Subscription> Subscriptions { get; set; }

在这里无耻地从 Scott Hanselmann 的演示中删减 - http://www.hanselman.com/blog/SimpleCodeFirstWithEntityFramework4MagicUnicornFeatureCTP4.aspx使用这种模式,这里也是使用相同想法的 Scott Guthrie 演示http://weblogs.asp.net/scottgu/存档/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx

List<T>是各种接口(ICollection、IQueryable、IEnumerable 等)的具体实现,Entity Framework 在从数据库中检索事物时使用代理对象,因此virtual声明使用这些接口的不同实现,这就是您的错误的来源。

于 2010-11-29T18:10:10.300 回答