2

私はEF5コードファースト、移行、およびタイプごとのテーブル継承を使用しています。他のクラスから継承するいくつかのクラスがあります。たとえば、TenantからLandlord継承しUserProfileます。

メソッドを使用して、protected override void Seed()テスト データをデータベースに追加しています。したがって、たとえば、2 つUserProfileのオブジェクトと 1Tenantおよび 1を作成しますLandlord。テナント エンティティが最初のユーザー プロファイル エンティティに関連付けられ、家主エンティティが 2 番目のユーザー プロファイル エンティティに関連付けられていることを確認するにはどうすればよいですか? table-per-type 継承を使用しているため、派生クラスのがその基本クラスのUserIdと等しいことを明示的に言う必要がありますか? UserId私は周りを検索しましたが、役に立つものは何も見つかりませんでした。私は次のようにそれをやろうとしました:

protected override void Seed(Context context)
    {
        var users = new List<UserProfile>
        {
             new UserProfile { UserId=1, UserName="Matt", Email="a@a.com", AccountType=AccountType.Tenant },
             new UserProfile { UserId=2, UserName="Dave", Email="a@a.com", AccountType=AccountType.Landlord }
        };
        users.ForEach(u => context.UserProfile.AddOrUpdate(u));
        context.SaveChanges();

        var tenants = new List<Tenant>
        {
            new Tenant { UserId = users.Single(x => x.UserId = 1) /* other properties */  }
            // ...
        };
        tenants.ForEach(t => context.Tenant.AddOrUpdate(t));
        context.SaveChanges();

        var landlords = new List<Landlord>
        {
            new Landlord { UserId = users.Single(x => x.UserId = 2) /* other properties */ }
            // ...
        };
        landlords.ForEach(l => context.Tenant.AddOrUpdate(l));
        context.SaveChanges();
    }
4

2 に答える 2

1

DbContext.Set<T>Maximc は正しい考えを持っていますが、メソッドを使用してAddOrUpdate、最初にデータベースから手動でフェッチすることなく、サブクラスのメソッドを利用できることがわかりました。

protected override void Seed(Context context)
{            
    context.Set<Tenant>().AddOrUpdate(
        t => t.UserName, // or whatever property you want to use as an identifier for duplicates
        new Tenant { UserId=1, UserName="Matt", Email="a@a.com" });

    context.Set<Landlord>().AddOrUpdate(
        t => t.UserName,
        new Tenant { UserId=2, UserName="Dave", Email="a@a.com" });
}

また、ディスクリミネーター (あなたの場合は AccountType) を自分で指定するべきではありません。POCO 継承を正しく設定すると、Entity Framework がバックグラウンドでそれを処理します。

于 2014-02-11T12:14:30.000 に答える
1

DbContext を使用して、割り当てたいエンティティをロードする必要があります。

これはそれを行う必要があります:

protected override void Seed(Context context)
    {
        var users = new List<UserProfile>
    {
         new UserProfile { UserId=1, UserName="Matt", Email="a@a.com", AccountType=AccountType.Tenant },
         new UserProfile { UserId=2, UserName="Dave", Email="a@a.com", AccountType=AccountType.Landlord }
    };
        users.ForEach(u => context.UserProfile.AddOrUpdate(u));
        context.SaveChanges();

        var tenants = new List<Tenant>
    {
        new Tenant { UserId = users.Single(x => x.UserId = context.UserProfile.First(x=>x.UserId = 1)) /* other properties */  }
        // ...
    };
        tenants.ForEach(t => context.Tenant.AddOrUpdate(t));
        context.SaveChanges();

        var landlords = new List<Landlord>
    {
        new Landlord { UserId = users.Single(x => x.UserId = context.UserProfile.First(x=>x.UserId = 2)) /* other properties */ }
        // ...
    };
        landlords.ForEach(l => context.Tenant.AddOrUpdate(l));
        context.SaveChanges();
    }
于 2013-02-03T15:36:50.990 に答える