2016-08-26 5 views
1

.NET Framework APIを使用して、Entity Framework Coreを使用してデータベース内のエンティティを更新することになっています。Entity FrameworkおよびJSON(C#)を使用して特定のプロパティを動的に更新する

ユーザが既存のエントリを編集すると、編集フォームは編集されたデータのみを返します。完全なエンティティは返しません。

のは、私たちが店を持っているとしましょう:

public class Shop { 
    public int ShopID { get;set;} 
    public string Name { get;set;} 
    public string Address { get;set;} 
} 

は今、ユーザーがアドレスを編集して保存します。 APIに送り返されるデータはShopIDとAddressになります。ただし、以下の結合モデルを使用すると、それが実際に渡されていないので、論理的であるNULLに名前を設定します。

[Route("~/shop/[action]")] 
public IActionResult Update([FromBody] Shop shop) 
{ 
    _context.Shops.Update(shop); 
    _context.SaveChanges(); 
    return new JsonResult(new { result = true }); 
} 

だから、私はプロパティ/ IEが更新される可能性があるかわからないので、(実際にはもっと多くのプロパティがあります)、POSTリクエストで送信されたフィールドだけを動的に更新する方法が必要です。

ありがとうございます。

答えて

3

DbSet<T>あなたが最初にエンティティをロードする必要がありますので、そのプロパティの値を変更し、SaveChangesを呼び出し、メソッドUpdateが含まれていません:それは迷惑をチェックすると、すべてのプロパティをコピーする原因

[Route("~/shop/[action]")] 
public IActionResult Update([FromBody] Shop shop) 
{ 
    var shopData = _context.Shops.Single(s => s.Id == shop.ShopId); 

    if (shop.Name != null) 
     shopData.Name = shop.Name; 

    if (shop.Address != null) 
     shopData.Address = shop.Address; 

    _context.SaveChanges(); 
    return new JsonResult(new { result = true }); 
} 

を、あなたAutomapperのようなライブラリを使用することができます:ヌルのプロパティをスキップする

[Route("~/shop/[action]")] 
public IActionResult Update([FromBody] Shop shop) 
{ 
    var shopData = _context.Shops.Single(s => s.Id == shop.ShopId); 

    // Copying properties to existing object 
    mapper.Map<Shop, Shop>(shop, shopData); 

    _context.SaveChanges(); 
    return new JsonResult(new { result = true }); 
} 

の答えを参照してくださいAutomapper skip null values with custom resolver

+0

だから、近いが、まだ行くにはいくつかの方法。 AutoMapperは素晴らしいと私は見ましたが、答えは '.ForAllMembers(opt => opt.Condition(srs =>!srs.IsSourceValueNull));'として最新バージョンで古くなっているようですが、実際にはIsSourceValueNullを含んでいません。 'IValueResolver'を実装することについてのもう一つの言及は有効ではないようです。そのインタフェースは3つのタイプ' public interface IValueResolver 'を必要とするからです。それとも、私は完全に愚かですか? – Max

+0

ご覧のとおり、https://github.com/AutoMapper/AutoMapper/issues/1406 '.ForAllMembers(x => x.Condition(y => y!= null))' –

+0

ありがとうございます参考までに、EF Coreには実際には.Update()というメソッドがあります。オンラインドキュメントには書かれていませんが、間違いなく動作し、VS intellisenseにあります。 – Max

0

私はそれをテストしていないが、コードは以下のようなものでなければなりません:

var entry = _context.Shops.Update(shop); 
foreach (var property in entry.Entity.GetType().GetTypeInfo().DeclaredProperties) 
{ 
     var currentValue = entry.Property(property.Name).CurrentValue; 
     if (currentValue == null) 
      entry.Property(property.Name).IsModified = false; 
} 
関連する問題