2

リポジトリレイヤーをさらに抽象化するために、http://msdn.microsoft.com/en-us/magazine/ee236639.aspxで説明されているコードファーストのアプローチに従うことを試みました。

アカウントエンティティとサブスクリプションエンティティの間には多対多の関係があります。ナビゲーションプロパティは、他のエンティティを指す各エンティティに存在します(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;
}

アカウントのモデルは次のようになります。

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; }

ここでスコットハンセルマンのデモから恥知らずにニックネームを付けられました-このパターンを使用するhttp://www.hanselman.com/blog/SimpleCodeFirstWithEntityFramework4MagicUnicornFeatureCTP4.aspx、同じアイデアを使用したスコットガスリーのデモもありますhttp://weblogs.asp.net/scottgu/ archive / 2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx

List<T>はさまざまなインターフェイス(ICollection、IQueryable、IEnumerableなど)の具体的な実装です。EntityFrameworkは、データベースから物を取得するときにプロキシオブジェクトを使用します。したがって、virtual宣言は、エラーの発生元であるこれらのインターフェイスのさまざまな実装を使用します。

于 2010-11-29T18:10:10.300 に答える