将属性实体映射到父实体上的列

本文关键字:实体 属性 映射 | 更新日期: 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 !