我将 Database First 与 Entity Framework 5 一起使用。我们有两个表(大大简化):
- 地址
- 街道
- 城镇(等)
- 顾客
- 姓名
- 帐单地址
- 邮寄地址
- 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.
我可以在设计器中编辑模型,更改导航属性以给我正确的名称。然而,这不是一个可行的解决方案,因为我们每次对数据库进行更改时都会重建模型。
我尝试过的一个选项是创建一个像这样的部分类(从现有的 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 会抱怨以下错误:
LINQ to Entities 不支持指定的类型成员“BillingAddress”。仅支持初始化程序、实体成员和实体导航属性。
有没有其他方法可以在客户对象中实现有意义的名称?
这是我最后想要的:
var j = myCustomer.BillingAddress;
var k = myCustomer.BillingAddress.Street;
var l = myCustomer.BillingAddress.Town; // etc.