簡體   English   中英

如何使用實體框架將屬性映射到不同的表

[英]How to map a property to a different table using Entity Framework

我的數據庫如下所示:

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

如何映射作為普通屬性存在於不同表中的產品名稱,以便如果有人請求它,EF 必須通過 Id 連接兩個表?

我認為在這種情況下您必須使用實體拆分。 您有一個實體 (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);
    }
}

這個解決方案可能比接受的答案“看起來”復雜,因為我在這里添加了一個外鍵。 但我敢打賭,無論如何大多數人都已經擁有這些外鍵,因此您只需添加NotMapped屬性即可。 這將只是 1 行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM