4

私は MVC を初めて使用し、他のモデルを使用するモデルを作成しようとしています。

データベースに 2 つのテーブルがあるとします。この質問のために、それらを Table1 と Table2 と呼びます。私の MVC プロジェクトでは、これらは Model1 と Model2 に対応しています。今、次のようなモデル 3 が欲しいです。

public class Model3
{
    public Model1 model1 { get; set; }
    public Model2 model2 { get; set; }
    public string someString { get; set; }
}

次のようなT-SQLクエリで作成したいもの:

SELECT * FROM Table1 t1
LEFT JOIN Table2 t2
    ON t1.fk = t2.pk

ここで、このクエリを実行するために、 http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-で説明されている手法を使用しています。 an-mvc-web-アプリケーション

関連するコードは次のとおりです。

public virtual IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters)
{
    return dbSet.SqlQuery(query, parameters).ToList();
}

上記のクエリを入力します。

問題 (ついに!) は、Entity Framework がキーを必要とすることです。これは問題にはなりませんが、この場合、キーは Model1.model1Keypart と Model2.model2keypart に対応する Table1.table1KeyPart と Table2.table2KeyPart です。

そこで、ここで 2 番目の手法を使用してみました: 最初にエンティティ フレームワーク コードで、複数の列で KeyAttribute を使用する方法

つまり、userID と userName の代わりにu.Model1.model1KeyPart、 HasKey を使用するものです。u.Model2.model2KeyPartこのような:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Model3>().HasKey(u => new
        {
            u.Model1.model1KeyPart,
            u.Model2.model2keyPart
        });
    }

エラーが発生します:

プロパティ式 '[u => new <>f__AnonymousType1`2(model1KeyPart = u.Model1.model1KeyPart, model2KeyPart = u.Model2.model2KeyPart)]' は無効です。式はプロパティを表す必要があります: C#: 't => t.MyProperty' VB.Net: 'Function(t) t.MyProperty'. 複数のプロパティを指定する場合は、匿名型を使用します: C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New From { t.MyProperty1, t.MyProperty2 }'.

これは修正可能なものですか?または、これを完全に間違った方法で行っていますか? Model3 内の Model1 と Model2 のすべてのメンバーを一覧表示することもできると思いますが、それは私が本当に望んでいない冗長性をもたらしますが、それが唯一の方法である場合は、そうします。

不明な点がありましたら申し訳ありませんが、必要に応じて整理します。助けてくれてありがとう!

4

1 に答える 1

4

複合キーを定義する必要があると思います。最初に Entity Framework コードを使用している場合は、このようなメソッドでこれdbContext.csを行うことができますOnModelCreating

modelBuilder.Entity<Model3>().HasKey(s => new { s.Model1Key, s.Model2Key });
于 2012-06-27T04:20:56.553 に答える