efcore 部分更新_在EF核心中执行部分更新且从不更新某些属性的最佳方法是什么?...

本文讨论了在EF Core中如何优雅地执行部分更新,避免不必要的属性修改。通过设置实体属性的AfterSaveBehavior为Ignore,可以确保某些属性在保存后不再被更新。示例代码展示了如何在模型构建器中配置这些行为,以及如何在Update方法中应用这些策略。
摘要由CSDN通过智能技术生成

I know you can do something like var myObj = _db.MyTable.FirstOrDefault(x=>x.Id==id) and then update myObj property by property that you want to update but is there a better way to update say 6 out of 10 properties of myObj and leave the other 4 alone or have them marked as a way that they are only set once and never updateable from ef core?

public class MyObject

{

public string Id { get; set; }

public string Prop1 { get; set; }

public string Prop2 { get; set; }

public string Prop3 { get; set; }

public string Prop4 { get; set; }

public string Prop5 { get; set; }

public string Prop6 { get; set; }

public string Prop7 { get; set; }

public string Prop8 { get; set; }

public string Prop9 { get; set; }

}

public void UpdateObj(MyObject ojToUpdate)

{

//Is there a better way to write this function if you only want to update a set amount of properties

var myObj = _db.MyObject.First(x=>x.Id==ojToUpdate.Id);

myObj.Prop1 = objToUpdate.Prop1;

myObj.Prop2 = objToUpdate.Prop2;

myObj.Prop3 = objToUpdate.Prop3;

myObj.Prop4 = objToUpdate.Prop4;

myObj.Prop5 = objToUpdate.Prop5;

myObj.Prop6 = objToUpdate.Prop6;

_db.SaveChanges();

}

Obviously you can write something like _db.MyObject.Update(objToUpdate). The problem with this statement is the user can update prop 4/5/6 which I don't want them to update.

Yes I know you can write _db.Entry(myObj).CurrentValues.SetValues(objToUpdate) and then call save changes but that will over ride properties that i want to be generated once and never modified again.

Thanks ahead of time.

解决方案

Starting with EF Core 2.0, you can use IProperty.AfterSaveBehavior property:

Gets a value indicating whether or not this property can be modified after the entity is saved to the database.

If Throw, then an exception will be thrown if a new value is assigned to this property after the entity exists in the database.

If Ignore, then any modification to the property value of an entity that already exists in the database will be ignored.

What you need is the Ignore option. At the time of writing there is no dedicated fluent API method for that, but Setting an explicit value during update contains an example how you can do that.

Taking your example, something like this:

modelBuilder.Entity(builder =>

{

builder.Property(e => e.Prop7).Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;

builder.Property(e => e.Prop8).Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;

builder.Property(e => e.Prop9).Metadata.AfterSaveBehavior = PropertySaveBehavior.Ignore;

});

Now both

public void UpdateObj(MyObject objToUpdate)

{

var myObj = _db.MyObject.First(x => x.Id == objToUpdate.Id);

_db.Entry(myObj).CurrentValues.SetValues(myObjToUpdate);

_db.SaveChanges();

}

and

public void UpdateObj(MyObject objToUpdate)

{

_db.Update(myObjToUpdate);

_db.SaveChanges();

}

will ignore Prop7, Prop8 and Prop9 values of the passed myObjToUpdate.

Update (EF Core 3.0+) The aforementioned property has been replaced with GetAfterSaveBehavior and SetAfterSaveBehavior extension methods.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值