如何使用Entity Framework将属性映射到不同的表

时间:2017-03-01 12:43:43

标签: c# entity-framework ef-fluent-api

我的数据库如下所示:

dbo.Products表:

Id        | int
Status    | tinyint

dbo.ProductNames表:

ProductId | int
Name      | nvarchar(4000)

代码的简化版本将是:

public class Product{
    public int Id { get; set; }
    public string Name { get; set; }
    public ObjectStatus Status { get; set; }
}

public class ProductEntityConfiguration : EntityConfiguration<Product> {
    public ProductEntityConfiguration() {
        ToTable("Products");
        HasKey(p => p.Id);
        Property(p => p.Id).HasColumnName("Id");
        Property(p => p.Status).HasColumnName("Status");
    }
}

如何将产品名称(作为普通属性存在于另一个表中)映射,以便在有人请求时,E.F。必须通过Id加入这两个表?

2 个答案:

答案 0 :(得分:2)

我认为在这种情况下你必须使用实体拆分。您有一个实体(产品),并且您希望将其拆分为两个表(Products和ProductNames)。 尝试使用以下映射:

  public class ProductEntityConfiguration : EntityConfiguration<Product> 
  {
      public ProductEntityConfiguration() 
      {
         Map(m => 
         { 
            m.Property(t => t.ProductId).HasColumnName("MyIdChanged");
            m.Property(t => t.Status).HasColumnName("Status");                
            m.ToTable("Product")
         }) 
         .Map(m => 
         { 
            m.Property(t => t.ProductId).HasColumnName("MyProductIdChanged");
            m.Property(t => t.Name).HasColumnName("MyProductName");
            m.ToTable("ProductNames"); 
         });
      }
  }

这将配置适当的主键和外键并自动进行连接。

答案 1 :(得分:-1)

我知道这太迟了,但是我正在研究同一问题,我发现接受的答案有点过于复杂(我需要连接3个表),并且我希望代码更简单。< / p>

因此,我选择改为使用[NotMapped]属性,这使代码更简单。

这是基于上述问题的示例解决方案。

public class Product{
    public int Id { get; set; }    
    public ObjectStatus Status { get; set; }

    // Foreign keys
    public int ProductNameId { get; set; }
    public virtual ProductName ProductName { get; set; }

    [NotMapped]
    public string Name => ProductName?.Name;    
}

public class ProductEntityConfiguration : EntityConfiguration<Product> {
    public ProductEntityConfiguration() {
        ToTable("Products");
        HasKey(p => p.Id);
        Property(p => p.Id).HasColumnName("Id");
        Property(p => p.Status).HasColumnName("Status");

        Property(p => p.ProductNameId).HasColumnName(@"ProductNameId").HasColumnType("int").IsRequired();
        HasRequired(a => a.ProductName).WithMany(b => b.Products).HasForeignKey(c => c.ProductNameId);
    }
}

此解决方案可能看起来比接受的答案复杂,因为我在这里添加了外键。但是我敢打赌,大多数人无论如何都已经拥有这些外键,因此您只需添加NotMapped属性就可以了。只需更改1行即可。