我的数据库如下所示:
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加入这两个表?
答案 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行即可。