如何使用 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 行更改。
我的数据库如下所示:
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 行更改。