私は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.