6

我将 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.
4

4 回答 4

5

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

于 2012-11-23T12:19:39.433 回答
2

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

例子:

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

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

于 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 回答