簡體   English   中英

忽略更新實體框架的一個屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM