[英]Ignore one property on update Entity Framework
我正在使用 .NET C# 和實體框架。
我有一種情況,我需要更新數據庫中的一個對象,但我會保持一個屬性不變。 我想知道可以這樣做嗎?
以下面的類為例:
public class Person
{
public int PersonId { get; set; }
public string Name{ get; set; }
public int Age { get; set; }
public DateTime CreationDate { get; set; }
}
所以我會在頁面中提供一個 HTML 表單供客戶端編輯一個人。 示例:
<form>
<input type="hidden" id="PersonId" value="1" />
<input type="text" id="Name" value="Cesar" />
<input type="text" id="Age " value="28" />
</form>
然后我會獲取值並將其發送到存儲庫以更新該人。 但是更新 CreationDate 沒有意義,我不想提供這種可能性。
所以我可以用兩種不同的方式來做到這一點。
1)我可以將它作為隱藏字段放在表單中並將其發回。 (但正如我所說,我不想提供這種可能性)
2) 在存儲庫中獲取 Person,更新它的字段並保留 CreationDate 日期相同,然后保存它:
void UpdatePerson(Person p){
var person = db.Persons.Find(PersonId);
person.Name = p.Name;
person.Age = p.Age;
db.Persons.Attach(person);
db.Entry(person).State = EntityState.Modified;
db.SaveChanges();
}
我想知道一種方法,我可以將“p”傳遞給上下文並更新它,使 CreationDate 保持原樣。
我希望我更清楚。
我很抱歉在第一篇文章中缺乏信息。
謝謝你的幫助。
就個人而言,我使用 AutoMapper 並在您不想復制的一個字段上使用 Ignore。 這樣,如果您向表中添加新列,則不必擔心將它們添加到存儲庫中。
所以,像這樣的事情......
void UpdatePerson(Person p) {
var person = db.Persons.Find(PersonId);
Mapper.CreateMap<Person, Person>()
.ForMember(dest => dest.CreationDate, opt => opt.Ignore());
Mapper.Map(p, person);
db.SaveChanges();
}
另外兩種方法...
向 SQL 表添加默認值
ALTER TABLE dbo.Person ADD CONSTRAINT
DF_Person_CreatedDate DEFAULT GetDate() FOR CreatedDate
使用支持字段並將其默認為 DateTime.Now
public DateTime CreatedDate
{
get { return createdDate; }
set { createdDate = value); }
}
private DateTime createdDate = DateTime.Now;
這就是我使用的,使用自定義 InjectNonNull (obj dest, obj src) 它使其完全靈活,即使您有兩個或更多字段
[HttpPost]
public async Task<IActionResult> Post( [FromQuery]Models.Currency currency ) {
if ( ModelState.IsValid ) {
// find existing object by Key
Models.Currency currencyDest = context.Currencies.Find( currency.Id );
context.Currencies.Attach( currencyDest );
// update only not null fields
InjectNonNull( currencyDest, currency );
// save
await context.SaveChangesAsync( );
}
return Ok();
}
// Custom method
public static T InjectNonNull<T>( T dest, T src ) {
foreach ( var propertyPair in PropertyLister<T, T>.PropertyMap ) {
var fromValue = propertyPair.Item2.GetValue( src, null );
if ( fromValue != null && propertyPair.Item1.CanWrite ) {
propertyPair.Item1.SetValue( dest, fromValue, null );
}
}
return dest;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.