如何将导航特性名称更改为有意义的名称



我正在使用实体框架5中的数据库优先。我们有两个表(大幅度简化):

  • 地址
    • 街道
    • 城镇(等)
  • 客户
    • 姓名
    • 账单地址
    • 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.

我可以在设计器中编辑模型,更改导航属性以获得正确的名称。然而,这不是一个可行的解决方案,因为我们每次对数据库进行更改时都会重建模型。

我尝试过的一个选项是创建这样的分部类(从现有的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.Customers"中的会员数不匹配。请确保会员数相同。

我尝试过使用[NotMapped()]属性,但没有任何区别。如果我删除[EdmRelationshipNavigationPropertyAttribute…]属性,则Linq会报告以下错误:

LINQ to Entities中不支持指定的类型成员"BillingAddress"。仅支持初始值设定项、实体成员和实体导航属性。

是否有其他方法可以在Customers对象中获得有意义的名称?

这是我最后想要的:

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

您可能不必担心这一点。在模型设计器中更改特性名称后,EF将记住自定义命名。它不会被后续更新覆盖。

您可以将属性添加到部分类中,这些属性将成为属性Address1Address2等的访问器。

示例:

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

更新:它将不适用于linq-to实体。恐怕这是数据库优先方法的局限性。这是我们使用EF Code First的原因之一。在"代码优先"中,您可以完全控制实体映射。(Code First意味着在代码中进行映射,但这并不意味着如果你不想要的话,你的数据库就会从这个代码中生成)。

我知道这有点过时,但处理这种情况的最简单/最好的方法似乎是利用EF5电动工具"先反向工程代码">

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

它为您提供了代码优先映射的所有优点,以及数据库优先对象创建的简单性/便利性。

这里描述了一个解决方案:

在反向工程数据库时改进导航属性名称

您可以在项目中包含代码生成模板(*.tt文件)。按照链接中的说明修改它们。样品在这里:https://github.com/markuspeter/EFPowerToolsTemplates(检查分支是否有更改)

然后可以使用更好的名称生成命名。

相关内容

  • 没有找到相关文章

最新更新