【问题标题】:In Entity Framework how do I configure a shadow owned entity?在实体框架中,如何配置影子拥有的实体?
【发布时间】:2021-10-14 13:47:47
【问题描述】:

在 EF Core 3.1 中,我正在尝试为我的基类实现 并发令牌。我遇到了存储在派生类拥有实体的共享表中的实体的问题。当派生类拥有单个属性时,建议将此属性创建为基类上的影子属性。但是,对于代表拥有类型的属性,我不知道该怎么做。我试图避免为拥有类型中的每个属性添加影子属性。

派生所有实体的类:

public class EntityClass
{
    ///...
    [Timestamp]
    public byte[] ConcurrencyToken { get; set; }
}

一个基类和拥有一个额外拥有类型的派生类的例子:

public class Transaction : EntityClass
{
    ///...
    public Company Counterparty { get; set; }
    public Currency TransactionCurrency { get; set; }
}
public class CashTransaction : Transaction
{
    ///...
    public Currency BankAccountCurrency { get; set; }
}

Currency 是一个拥有的模型,其属性存储在与Transaction 相关的表中:

[Owned, ComplexType]
public class Currency
{
    ///...
    public string CurrencyName { get; set; }
    public string CurrencySymbol { get; set; }
}

当我添加迁移时,显示以下错误:

实体类型“CashTransaction.BankAccountCurrency#Currency”不包含映射到存储生成的并发令牌列“ConcurrencyToken”的属性,该列由共享表“Transaction”的另一个实体类型使用。将映射到同一列的商店生成的属性添加到“CashTransaction.BankAccountCurrency#Currency”。它可以处于阴影状态。

我尝试了几次配置shadow属性,例如:

modelBuilder.Entity<Transaction>().OwnsOne<Currency>("BankAccountCurrency");

【问题讨论】:

    标签: c# entity-framework-core


    【解决方案1】:

    编辑: 以下不起作用:它会导致派生类的更改跟踪出现问题。

    有一段时间我认为下面会起作用:创建拥有实体的私有属性,然后在 modelBuilder 调用中配置它:

    public class Transaction : EntityClass
    {
        ///...
        public Company Counterparty { get; set; }
        public Currency TransactionCurrency { get; set; }
        private Currency BankAccountCurrency { get; set; }
    }
    
    modelBuilder.Entity<Transaction>().OwnsOne(typeof(Currency), nameof(CashTransaction.BankAccountCurrency));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 2010-09-13
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多