ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何将导航属性名称更改为有意义的名称

2019-05-20 15:51:59  阅读:243  来源: 互联网

标签:c entity-framework entity-framework-5 ef-database-first


我正在使用Database First和Entity Framework 5.我们有两个表(大规模简化):

>地址

>街
>镇(等)

>客户

>姓名
> BillingAddress
> 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;
        }
    }
}

但是当我运行它时,我收到以下错误:

The number of members in the conceptual type ‘MyModel.Customer’ does not match with the number of members on the object side type ‘MyNamespace.DataModel.Customer’. Make sure the number of members are the same.

我已经尝试使用[NotMapped()]属性,但这没有任何区别.如果我删除[EdmRelationshipNavigationPropertyAttribute …]属性,那么Linq会抱怨以下错误:

The specified type member ‘BillingAddress’ is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

有没有其他方法可以在Customers对象中实现有意义的名称?

这就是我最终想要的东西:

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

解决方法:

您可以向属于Address1,Address2等属性的访问器的分部类添加属性.

例:

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

更新:它不适用于linq实体.
我担心这是数据库第一种方法的限制.这是我们使用EF Code First的原因之一.在Code First中,您可以完全控制实体映射. (代码优先意味着在代码中进行映射,这并不意味着如果您不希望它从此代码生成您的数据库).

标签:c,entity-framework,entity-framework-5,ef-database-first
来源: https://codeday.me/bug/20190520/1144103.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有