将属性实体映射到父实体上的列
本文关键字:实体 属性 映射 | 更新日期: 2023-09-27 18:15:35
假设我有两个简单的类:
public class Product
{
public int Id { get; set; }
public string Description { get; set; }
public Price Price { get; set; }
}
public class Price
{
public decimal Amount { get; set; }
public string Currency { get; set;
}
注意产品价格是Price
的一个实例。
现在:我想使用实体框架(首先是代码)在一个名为"产品"的表中存储Product
的实例,但我也希望它简单地将Price属性存储为字符串,即。"100USD",或者一个十进制和字符串列。
默认情况下,EF也会尝试创建一个"Prices"表,但是抱怨主键没有可用的属性。
有办法解决这个问题吗?
同样重要的是,我不需要添加"cruft"到我的模型中,即额外的方法或属性来适应EF。理想情况下,我只需要配置EF,以便在遇到'Price'类的实例时将其映射到列。
我不确定到底是正确的符号,但这几乎是我所知道的最简单和最可维护的方法。(我已经在下面附上了marc_s的评论/建议)。
public class Product
{
public Product()
{
this.Price = new Price();
}
public int Id { get; set; }
public string Description { get; set; }
[NotMapped]
public Price Price { get; set; }
[Column("Price")]
public string RawPrice
{
get
{
return this.Price.<yourfield>;
}
set
{
this.Price.SetRawValue(value);
}
}
[Column("Currency")]
public string RawCurrency
{
get
{
return this.Price.<yourfield>;
}
set
{
this.Price.SetRawCurrency(value);
}
}
}
public class Price
{
public decimal Amount { get; set; }
public string Currency { get; set;
public void SetRawPrice(string value)
{
//parse raw value into amount
}
public void SetRawCurrency(string value)
{
//parse raw value into currency
}
}
这可能工作,也可能不工作,我不能测试它:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ComplexType<Price>();
modelBuilder.Entity<Product>()
.Property(p => p.Price.Amount)
.HasColumnName("Amount");
modelBuilder.Entity<Product>()
.Property(p => p.Price.Currency)
.HasColumnName("Currency");
}
我想这是为了使模型变平,但我以前从来没有这样做过。YMMV !