[英]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.