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

How to map a property to a different table using Entity Framework

我的数据库如下所示:

dbo.Products Table:

Id        | int
Status    | tinyint

dbo.ProductNames Table:

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");
    }
}

如何映射产品名称,该名称与普通 属性 存在于不同的 table 中,以便在有人请求时 E.F。必须通过 Id 加入两个 table 吗?

我认为在这种情况下您必须使用实体拆分。您有一个实体 (Product),您希望将其拆分为两个表(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"); 
         });
      }
  }

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

我知道这太晚了,但我正在研究同样的问题,我发现接受的答案对我来说有点太复杂了(我需要加入 3 个表),我希望我的代码更简单.

所以我选择使用[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);
    }
}

此解决方案可能 'look' 比接受的答案复杂,因为我在此处添加外键。但我敢打赌大多数人已经有了这些外键,所以你需要做的就是添加 NotMapped 属性 就完成了。这只是 1 行更改。