实体框架(CTP5、Fluent API)。重命名导航属性的列

Posted

技术标签:

【中文标题】实体框架(CTP5、Fluent API)。重命名导航属性的列【英文标题】:Entity framework (CTP5, Fluent API). Rename column of navigation property 【发布时间】:2011-01-11 17:59:42 【问题描述】:

我有两个实体:

public class Address

        public int Id  get; set; 
 public string FirstName  get; set; 
 public string LastName  get; set; 


public partial class Customer
    
        public int Id  get; set; 
        public string Email  get; set; 
        public string Username  get; set; 

        public virtual Address BillingAddress  get; set; 
        public virtual Address ShippingAddress  get; set; 
    

以下是映射类:

public partial class AddressMap : EntityTypeConfiguration<Address>
    
        public AddressMap()
        
            this.ToTable("Addresses");
            this.HasKey(a => a.Id);
        
    
public partial class CustomerMap : EntityTypeConfiguration<Customer>
    
        public CustomerMap()
        
            this.ToTable("Customer");
            this.HasKey(c => c.Id);

            this.HasOptional<Address>(c => c.BillingAddress);
            this.HasOptional<Address>(c => c.ShippingAddress);
        
    

生成数据库时,我的“客户”表有两列用于“BillingAddress”和“ShippingAddress”属性。他们的名字是“AddressId”和“AddressId1”。 问题:如何将它们重命名为“BillingAddressId”和“ShippingAddressId”?

【问题讨论】:

【参考方案1】:

基本上,您希望在独立关联中自定义 FK 列名称,此代码将为您执行此操作:

public CustomerMap()

    this.ToTable("Customer");            

    this.HasOptional<Address>(c => c.BillingAddress)
        .WithMany()
        .IsIndependent().Map(m => 
        
            m.MapKey(a => a.Id, "BillingAddressId");                    
        );

    this.HasOptional<Address>(c => c.ShippingAddress)
        .WithMany()
        .IsIndependent().Map(m =>
        
            m.MapKey(a => a.Id, "ShippingAddressId");
        );            

【讨论】:

我已经按照您的建议进行了更改。但在我最初的帖子中,我简化了模型。我的客户类还有一个包含所有地址列表的属性:“public virtual ICollection Addresses get; set; ”。并且客户配置类(CustomerMap)多了一行:“this.HasMany(c => c.Addresses).WithMany().Map(m => m.ToTable("CustomerAddresses"));”现在我收到以下错误:“序列包含多个匹配元素”。有什么想法吗? 没问题。我已经复制并粘贴了您的附加代码,通过在客户和地址之间创建新的多对多关联,它对我非常有效,因此我无法重现您的异常。您能否发布您的完整对象模型和客户端代码? 当然,您可以在这里下载它nopcommerce.codeplex.com/SourceControl/list/changesets(我们正在开发新版本的 nopCommerce 购物车)。注意:您建议的解决方案(独立关联)尚未添加到源代码中。只需添加它并尝试运行单元测试 好吧,您需要创建一个简单的控制台应用程序并在其中尝试我的解决方案,您会看到它完美地创建了所需的架构。但是,如果您不这样做,请不要担心,我已经为您完成了:您可以从此链接下载我的示例项目并亲自查看:cid-31fdfaaf183abb01.skydrive.live.com/… Morteza,感谢您的宝贵时间。您的应用程序运行良好。我会尝试在我的模型中找到问题。虽然我仍然认为 CTP5 中存在一些错误

以上是关于实体框架(CTP5、Fluent API)。重命名导航属性的列的主要内容,如果未能解决你的问题,请参考以下文章

实体框架Fluent API中的两个FK

实体框架 CTP5,代码优先。可选的导航属性

实体框架代码优先 CTP5:如何定义非原始类型

使用实体框架 Fluent Api 映射 System.Uri

一对一或零对一实体框架代码优先 Fluent Api

实体框架代码优先 - Fluent Api 与数据注释的优缺点 [关闭]