6

私はEntityFramework5でDatabaseFirstを使用しています。2つのテーブルがあります(大幅に簡略化されています)。

  • 住所
    • 町(など)
  • お客様
    • 名前
    • 請求先住所
    • DeliveryAddress
    • AltDeliveryAddress

Visual Studioを使用してデータベースをEF(「データベースからモデルを更新」)にインポートすると、次のようなコードになります。

Customer myCustomer;
var a = myCustomer.Address;
var b = myCustomer.Address1;
var c = myCustomer.Address2;

私が明らかに欲しいのはこのようなものです:

var a = myCustomer.BillingAddress;
var z = myCustomer.BillingAddress.Street; // etc.

デザイナでモデルを編集し、ナビゲーションプロパティを変更して正しい名前を付けることができます。ただし、データベースに変更を加えるたびにモデルを再構築するため、これは実行可能なソリューションではありません。

私が試したオプションの1つは、次のような部分的なクラスを作成することです(既存のMyModel.Designer.csからコピーされたコードで、プロパティ名だけが変更されています)。

public partial class Customer : EntityObject
{
    [EdmRelationshipNavigationPropertyAttribute("MyModel", "FK_Customers_Addresses_BillingAddress", "Address")]
    public Address BillingAddress
    {
        get {
            return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<LookupItem>("MyModel.FK_Customers_Addresses_BillingAddress", "Address").Value;
        }
        set {
            ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<LookupItem>("MyModel.FK_Customers_Addresses_BillingAddress", "Address").Value = value;
        }
    }
}

ただし、これを実行すると、次のエラーが発生します。

概念タイプ'MyModel.Customer'のメンバーの数が、オブジェクト側タイプ'MyNamespace.DataModel.Customer'のメンバーの数と一致しません。メンバーの数が同じであることを確認してください。

[NotMapped()]属性を使用してみましたが、違いはありません。[EdmRelationshipNavigationPropertyAttribute ...]属性を削除すると、Linqは次のエラーで文句を言います。

指定されたタイプメンバー'BillingAddress'は、LINQtoEntitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされます。

Customersオブジェクトで意味のある名前を実現する他の方法はありますか?

これが私が最後に欲しいものです:

var j = myCustomer.BillingAddress;
var k = myCustomer.BillingAddress.Street;
var l = myCustomer.BillingAddress.Town; // etc.
4

4 に答える 4

5

あなたはおそらくこれについて心配する必要はありません。モデルデザイナでプロパティ名を変更した後、EFはカスタムの名前を記憶します。その後の更新によって上書きされることはありません。

于 2012-11-23T12:19:39.433 に答える
2

Address1プロパティなどへのアクセサとなるプロパティを部分クラスに追加できますAddress2

例:

public partial class Customer : EntityObject
{
    public Address BillingAddress
    {
         get 
         {
             return this.Address;
         }
         set 
         {
              this.Address = value;
         }
    }
}

更新:linqtoエンティティでは機能しません。これはデータベースファーストアプローチの制限だと思います。これが、EFコードファーストを使用する原因の1つです。コードファーストでは、エンティティマッピングを完全に制御できます。(コードファーストはコードでのマッピングを意味します。不要な場合にこのコードからデータベースが生成されることを意味するわけではありません)。

于 2012-11-23T12:21:16.027 に答える
0

これは少し古いことは知っていますが、この状況を処理する最も簡単で最良の方法は、EF5電動工具の「リバースエンジニアリングコードを最初に」活用することだと思われます。

http://msdn.microsoft.com/en-us/data/jj200620

これは、データベースファーストオブジェクト作成のシンプルさ/便利さを備えたコードファーストマッピングのすべての利点を提供します。

于 2013-06-04T13:48:16.513 に答える
0

ここに説明されている解決策があります:

データベースをリバースエンジニアリングするときのナビゲーションプロパティ名を改善する

コード生成テンプレート(* .ttファイル)をプロジェクトに含めることができます。リンクに記載されているように変更してください。サンプルはここにあります:https ://github.com/markuspeter/EFPowerToolsTemplates (ブランチの変更を確認してください)

そうすれば、より適切な名前で名前を生成できます。

于 2015-08-12T06:57:11.113 に答える