1

集計と値オブジェクトを EF7 と組み合わせて使用​​すると、問題が発生します。

これは集計です:

public class MasterAgreement
{
    private string _name;

    public Guid Key { get; set; }
    public MasterAgreementRaise RegularRaise { get; private set; }
    public MasterAgreementRaise MarketRaise { get; private set; }

    protected MasterAgreement()
    { }

    public MasterAgreement(Guid key)
    {
        Key = key;
    }

    public MasterAgreement(Guid key, string name, MasterAgreementRaise regularRaise, MasterAgreementRaise marketRaise)
    {
        Key = key;
        _name = name;
        RegularRaise = regularRaise ?? throw new DomainException("Regular raise is missing");
        MarketRaise = marketRaise ?? throw new DomainException("Market raise is missing");
    }

    public void Update(MasterAgreement masterAgreement)
    {
        _name = masterAgreement._name;
        RegularRaise = masterAgreement.RegularRaise;
        MarketRaise = masterAgreement.MarketRaise;
    }
   }

これは値オブジェクトです:

public class MasterAgreementRaise : ValueObject
{
    public int RaiseType { get; private set; }
    public int ConditionType { get; private set; }
    public decimal? Value { get; private set; }

    private MasterAgreementRaise() { }

    public MasterAgreementRaise(int raiseType, int conditionType, decimal? value)
    {
        RaiseType = raiseType;
        ConditionType = conditionType;
        Value = value;
    }

    protected override IEnumerable<object> GetAtomicValues()
    {
        // Using a yield return statement to return each element one at a time
        yield return RaiseType;
        yield return ConditionType;
        yield return Value;
    }
}

したがって、MasterAgreement には 2 つの public MasterAgreementRaise フィールドが含まれます

データベースを生成するためのエンティティ構成は次のように行われ、DDD プリンシパルに正しく準拠するデータベースが生成されます。

public class MasterAgreementTypeConfiguration : IEntityTypeConfiguration<MasterAgreement>
{
    public void Configure(EntityTypeBuilder<MasterAgreement> builder)
    {
        builder.HasKey(item => item.Key);

        builder.Property<Guid>("Key");
        builder.Property<string>("Name").IsRequired().HasMaxLength(250);

        builder.OwnsOne(item => item.RegularRaise);
        builder.OwnsOne(item => item.MarketRaise);
    }
}

データベースから基本契約を更新または削除しようとすると、EF7 はこれを処理できません。

更新中のエラー: {'MasterAgreementKey'} の同じキー値を持つ別のインスタンスが既に追跡されているため、エンティティ タイプ 'MasterAgreement.RegularRaise#MasterAgreementRaise' のインスタンスを追跡できません。所有エンティティを置き換える場合は、インスタンスを変更せずにプロパティを変更するか、以前の所有エンティティ エントリを最初に切り離します。

削除中: The entity of 'MasterAgreement' is shared the table 'MasterAgreement' with MasterAgreement.RegularRaise#MasterAgreementRaise', but there's no entity of this type with the same key value that has been Marked as 'Deleted'.

値オブジェクトを失い、識別子を追加してエンティティに変更せずにこれを解決するにはどうすればよいですか?

すべての助けに感謝します

4

1 に答える 1