5

という名前のテーブルが 1 つあるデータベースがあるとしますProducts。そのため、Db First アプローチを使用して、VS 2012 でpluralize and singularizeオプション付きの EF モデルを作成します。

したがって、モデルによってProductエンティティが作成され、デフォルトの命名規則によってこのエンティティがdbo.Productsテーブルにマップされます。

今、私はこの行動を変えたいと思っています。ProductModel実際、エンティティをdbo.Productsテーブルにマップするためのカスタム規則を作成したいと考えています。

これは可能ですか?もしそうなら、どのように?

更新:それを行う私の目標...

ご存知のように、データベースからモデルを更新するたびに、モデルに変更が生じると、自動生成されたエンティティが上書きされます。

一方、データ注釈属性をエンティティ プロパティに追加して、それらを使用してビューを形成し、次の挿入のように DbContext を単純に操作できるようにしたいと考えています。

public ActionResult Create(Product product)
    {
        if (ModelState.IsValid)
        {
            db.Products.Add(product);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(product);
    }

問題は、アプリケーションの分析が完了しておらず、データベースが時々変更されることです。したがって、データベースからモデルを更新する必要があり、その後、すべての属性が削除されます。

そこで、ProductModelクラスを作成してProductコードをコピーし、ビューをビュー モデルとして渡すことにしました。次に、データベースにクエリを実行したい場合、dbo.ProductModels名前がデータベースに存在しないという例外が発生します...

前もって感謝します

4

1 に答える 1

3

デフォルトでは、データベース ファーストのアプローチでは、常にテーブル名が同じ名前のエンティティにマップされます (複数形/単数形の可能性があります)。現在、EF には、規則やツールによってそれを微調整するための規定はありません。モデルを変更/適応/カスタマイズできますが、再生成すると、それらの変更は失われます。データベースからモデルを再生成した後に、何らかの形でこれらの変更を「保存」して再適用するためのツール/スクリプト/ハックを認識していません。

生成されたクラスを拡張する必要がある場合は、それらが部分クラスであるという事実を使用することをお勧めします。生成されたクラスを 2 番目の物理ファイルで拡張できます。

これを別のファイルに書きます。例ProductExtension.cs:

public partial class Product
{
   // add your custom methods etc. here
}

そのクラスを構成するさまざまなファイルは、C# コンパイラによって1 つのクラスにマージされます。

既存の生成されたクラスにデータ注釈を追加する必要がある場合は、この SO の質問とその回答に示されているように、MetadataType(..) 属性を使用できます。

これを別のファイルに書きます。例ProductExtension.cs:

[MetadataType(typeof(ProductMetaData))]
public partial class Product
{
}

次のように、製品クラスのメタデータ/データ注釈をさらに別のファイルで定義しますProductMetadata.cs

public class ProductMetaData
{
    [Required]
    public int RequestId {get;set;}
    //...
}
于 2013-07-20T12:35:49.753 に答える