为了账号安全,请及时绑定邮箱和手机立即绑定

在SaveChanges之前的实体框架核心更改实体关系

在SaveChanges之前的实体框架核心更改实体关系

C#
长风秋雁 2021-05-12 17:23:38
在以通用方式调用SaveChanges之前,有什么方法可以更新实体关系?public class Vehicle{    public int Id { get; set; }    public int OwnerId { get; set; }    [ForeignKey("OwnerId")]    public Person Owner { get; set; }}例如,我想创建一个新的Person,并在生成ID之前将其分配给Vehicle(在调用SaveChanges之前)。我知道我可以这样做:entry.Property("OwnerId").CurrentValue = newId;但是问题在于在调用之前我不知道新实体的ID SaveChanges。我要实现的是在更改时自动创建所有者的副本,并将所有者分配给该副本。当然,我必须在SaveChanges覆盖内以某种方式执行此操作。就像是:public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken)){    foreach (var entry in ChangeTracker.Entries())    {       foreach (var reference in entry.References)       {          if (reference.TargetEntry != null && reference.TargetEntry.State == EntryState.Modified)          {              // make a copy of target entry and update reference to it,             // note: you can't really add new entries inside this loop as it will throw an exception, so all the adding has to be done outside            // I would like to set this newEntity as the Owner            var newEntity = (BaseEntity)entry.CurrentValues.ToObject();            newEntity.Id = 0;          }       }    }    return await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);}我希望它如何工作://would insert new Person row and update OwnerId to point to this new rowvehicle.Owner.Name = "NewName";
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

您应该更新引用,以便在没有ID时更新ID:


public override async Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))

{

    foreach (var entry in ChangeTracker.Entries())

    {

       bool shouldUpdateReference = false;


       foreach (var reference in entry.References)

       {

           if (reference.TargetEntry != null && reference.TargetEntry.State == EntryState.Modified)

           {

               shouldUpdateReference = true;

           }

       }


        // I imagine this has to be done outside the foreach 

        // since you are modifying a reference and that should 

        // update the References collection

        if (shouldUpdateReference)

        {

            entity.Reference("Owner").CurrentValue = newOwner; 

        }

    }


    return await base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);

}


查看完整回答
反对 回复 2021-05-23

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号