2

モデル内の他のテーブル/エンティティに対してかなり複雑なロジックを実行し、一連の列を公開する SQL Server ビューを作成しました。これらの列は 1 つを除いてすべて単純型 (bigints、nvarchars など) ですが、1 つがモデル内の複雑なエンティティです。

次のように、このビューにマップするエンティティを作成しました。

public class NetworkSuppliersByClient : Entity, IKeyed<long>
{
    public long NetworkSuppliersByClientId { get; set; }

    public long NetworkId { get; set; }
    public String NetworkName { get; set; }
    public long OwningClientId { get; set; }
    public long ClientId { get; set; }
    public virtual Supplier Supplier { get; set; }
    public bool PublicEntry { get; set; }

    public long GetKey ()
    {
        return NetworkSuppliersByClientId;
    }
}

ご覧のとおり、サプライヤー エントリはモデル内の既存のエンティティにマップされ、それ自体が他の含まれるエンティティ (別名テーブル) との複合型です。

私が抱えている問題は、ビューから読み取ろうとすると、「エンティティ タイプ NetworkSuppliersByClient は、現在のコンテキストのモデルの一部ではありません。」というエラーが表示されることです。

ただし、コンテキストを使用してエンティティを DbSet として登録しようとすると、 「データベースに 'NetworkSuppliersByClients' という名前のオブジェクトが既に存在します。」というエラーが表示されます。これは、既存のビューと同じ名前のテーブルを作成しようとするためです。 .

たとえば、起動時に EF がテーブルを作成しようとするのを禁止する、またはビューから読み取るためのより良い方法はありますか?

4

1 に答える 1

1

興味のある他の人には、私は問題を回避することになりました。

代わりにエンティティ NetworkSuppliersByClient (上に表示) をビュー レスポンスからのレスポンスに直接マッピングしました。

public class NetworkSuppliersByClient : Entity, IKeyed<long>
{
    public long NetworkSuppliersByClientId { get; set; }

    public long NetworkId { get; set; }
    public String NetworkName { get; set; }
    public long OwningClientId { get; set; }
    public long ClientId { get; set; }
    public long SupplierId { get; set; }    <-- Long, rather than "Supplier"
    public bool PublicEntry { get; set; }

    public long GetKey ()
    {
        return NetworkSuppliersByClientId;
    }
} 

サプライヤー ID のリストを取得したら、(.Contains() メソッドを使用して) 後続の Entity Framework クエリを実行し、すべてのサプライヤーを実際の EF エンティティとして返します。

重要なのは、エンティティ (上記の私の場合は NetworkSuppliersByClient) が、DbContext サブクラス内で宣言された DbSet メンバーとして存在してはならないこと、または既存の DbSet<> に既に存在するエンティティによって実際に参照されてはならないことです。このルールを適用すると、Entity Framework は起動時にテーブルを作成しようとしないため、既存のビューと競合することはありません。

于 2012-11-16T16:07:17.133 に答える