3

私はEF初心者(任意のバージョン)であり、Google-fooはこれを行う方法を見つけることができませんでした。これは私がこれを間違っているに違いないと思いますが、状況は次のとおりです。

私は間違いなくデータベースが最初の環境にいて、スキーマはコーダーによって更新されません。また、私は「自動」コード生成のファンではないので、デザイナーや EF パワーツールには近づきませんでした (動作を確認するためだけに実行しましたが)。

簡単な Web API 2 エンドポイントをいくつか作成しながら操作できるように、Northwind DB を LocalDB にインポートしました。Northwind で Employees、Shippers、および Region テーブルのスリム化されたモデルを作成したため、これはすべてうまくいきました。Region は複数形ではなく、EF はそれに関して問題を抱えていたため、特に興味深いものでした。とにかく、私はそれを手に入れました。

今の私の悩みは; テーブルの代わりにビューをソースとして使用したいのですが、何をしてもうまくいかないようです。私が試したのは、テーブルと同じようにセットアップすることでした。しかし、それはModelValidationExceptionエラーを引き起こします。デザイナーから自動生成されたコードを調べてみましたが、洞察が得られませんでした。

私のモデル:

//-- employee, shipper, & region work as expected
public class employee {
    public int EmployeeID { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public class shipper {
    public int ShipperID { get; set; }
    public string CompanyName { get; set; }
    public string Phone { get; set; }
}

public class region {
    public int RegionID { get; set; }
    public string RegionDescription { get; set; }
}

//-- invoice is a view (actual viewname is 'Invoices')
//-- so i followed the same rules as i did for employee & shipper
//-- i have tried uppercase 'I' as well as a plural version of the model
public class invoice {
    public string CustomerID { get; set; }
    public string CustomerName { get; set; }
    public string Salesperson { get; set; }
    public int OrderID { get; set; }
    public int ProductID { get; set; }
    public string ProductName { get; set; }
}

私のコンテキストは次のようになります。

public class NorthwindDBContext : DbContext {
    public DbSet<Employee> Employees { get; set; }
    public DbSet<shipper> Shippers { get; set; }
    public DbSet<region> Regions { get; set; }
    public DbSet<Invoice> Invoices { get; set; } //-- offending line of code

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        //--- fix for Region being singular instead of plural
        modelBuilder.Entity<region>().ToTable("Region");
    }
}

public DbSet<Invoice> Invoices { get; set; }コンテキスト内の行をコメントアウトすると、すべてが機能します。行が存在するだけで (Invoices プロパティを参照していなくても) ModelValidationException、とにかくコンテキストを使用するとエラーが発生します。

ここで私が間違っていることを誰か教えてもらえますか? ありがとう。

更新: コントローラーの 1 つでこれを試しましたが、レコードを取得する限りは機能しましたが、これが正しいパスであるかどうかを知るにはあまりにも初心者です。

using (var dbContext = new NorthwindDBContext()) {
    return dbContext.Database.SqlQuery<Invoice>("select * from invoices").ToList();
}
4

1 に答える 1

0

IDコード ファーストの規則では、キーとして使用するorInvoiceIDプロパティを探します。あなたのInvoiceモデルにはどちらもありませんが、他のモデルにはあります。これが、コードが失敗する特定の理由です。

具体的ではないのは、一意のキーがないエンティティを EF に含めることはできないということです。可能であれば、ビューにキーを定義させます。それ以外の場合は、問題を回避できる可能性があります。

于 2013-11-12T19:56:06.437 に答える