Entity Framework(Core)がAdd()操作で古いレコードを削除するのはなぜですか?

asp.net-core c# entity-framework entity-framework-core

質問

私は従業員の賃金率の履歴を追跡する必要があるエンティティを持っています。 employeeRateオブジェクトは次のとおりです。

public class EmployeeRate : BaseEntity
{
    [Key]
    public int EmployeeRateId { get; set; }

    public int EmployeeId { get; set; }

    public double Rate { get; set; }
}

public class BaseEntity
{
    public bool ActiveFlag { get; set; }

    public DateTime CreateStamp { get; set; }

    public DateTime UpdateStamp { get; set; }

    public string LastModifiedBy { get; set; }
}

だから履歴を追跡するために、私が従業員のレートを更新するとき、Idですべての古いレコードを取得し、ActiveFlagをfalseに設定し、新しい支払レートとActiveFlagがtrueに設定された新しいエンティティを追加します。この操作のための私の関数は次のとおりです。

private EmployeeRate UpdateRate(EmployeeRate model, string currentUser)
{
    var existingRates = _context.EmployeeRates.Where(r => r.EmployeeId == model.EmployeeId).ToList();
    foreach(var rate in existingRates)
    {
        rate.ActiveFlag = false;
        rate.UpdateStamp = DateTime.UtcNow;
        rate.LastModifiedBy = currentUser;
    }
    _context.SaveChanges();

    var newRate = new EmployeeRate()
    {
        EmployeeId = model.EmployeeId,
        Rate = model.Rate,
        ActiveFlag = true,
        CreateStamp = DateTime.UtcNow,
        UpdateStamp = DateTime.UtcNow,
        LastModifiedBy = currentUser
    };

    newRate = _context.EmployeeRates.Add(newRate).Entity;
    _context.SaveChanges();

    return newRate;
} 

私のDbContextオブジェクトでAdd操作を実行すると、EntityFrameworkによって生成されたSQLは何らかの理由でその従業員のすべての古いレコードを削除しています。
生成されるSQL:

employeerates削除Where EmployeeRateId = @ p0;

INSERT INTOのemployeeratesActiveFlagCreateStampEmployeeIdLastModifiedByRateUpdateStamp )VALUES(@ p1、@ p2、@ p3、@ p4、@ p5、@ p6); SELECT EmployeeRateId FROM employeerates WHERE ROW_COUNT()= 1 AND EmployeeRateId = LAST_INSERT_ID();

なぜこれが起こっていますか? EFがこれらの古いレコードを削除しないようにする方法はありますか?

EDIT

私はasp.netコアとエンティティフレームワークのコアを使用しています。

受け入れられた回答

私を愚かと呼ぶ準備をする...

私はEmployeeRateオブジェクトの履歴をどのように追跡したいのかで、EmployeeとEmployeeRateの関係が正しくないと考えていました。ここに私のオリジナルの従業員オブジェクトがありました(私は元々投稿していたはずです):

    public class Employee : BaseEntity
    {
        public int EmployeeId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public string Email { get; set; }

        public string PhoneNumber { get; set; }

        public int HomeLocationId { get; set; }




        //Navigation Properties
        public virtual Location HomeLocation { get; set; }

        public virtual EmployeeRate EmployeeRate { get; set; }
    }

あなたの中には、すぐに問題が発生する人もいます。実際にはEmployeeRate参照は次のとおりです。

public virtual List<EmployeeRate> EmployeeRates { get; set; }

それは実際には1対多の関係であるからです。私は従業員1人当たりの金利を持っていなければならないと考えていたため、EFに関する限り、これまでに単数の参考文献しか持っていませんでした。だから私が参照を更新したとき、EFはそれが1対1だと思ったので、同じ参照を持つ他のすべてのレコードを削除しました。一度に1つのレートしか「アクティブ」ではなく、実際には「1対多数」です。そのため、EmployeeRateナビゲーションプロパティは、EFが正しく動作し、古いレコードを削除しないためのリストまたはコレクションとして参照する必要があります。愚かな私;)



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ