特定のエンティティオブジェクトのproperty1とproperty2を除くすべてのフィールドを更新する必要があります。
このコードを持っている:
[HttpPost]
public ActionResult Add(object obj)
{
if (ModelState.IsValid)
{
context.Entry(obj).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
return View(obj);
}
このコードで更新されないためにobj.property1とobj.property2に例外を追加するように変更するにはどうすればよいですか?
除外するプロパティのコレクションがあると仮定します。
var excluded = new[] { "property1", "property2" };
.NET 4.5のEF5では、これを行うことができます。
var entry = context.Entry(obj);
entry.State = EntityState.Modified;
foreach (var name in excluded)
{
entry.Property(name).IsModified = false;
}
これは、.NET 4.5のEF5の新しい機能を使用します。これにより、プロパティが以前に変更された後でも、プロパティが変更されないように設定できます。
.NET 4でEF 4.3.1またはEF5を使用する場合、代わりにこれを行うことができます。
var entry = context.Entry(obj);
foreach (var name in entry.CurrentValues.PropertyNames.Except(excluded))
{
entry.Property(name).IsModified = true;
}
このような例外を定義することはできません。ただし、単一のプロパティを変更済みとしてマークできます。
context.Entry(obj).Property(o => o.Property3).IsModified = true;
context.Entry(obj).Property(o => o.Property4).IsModified = true;
// etc.
エンティティ全体の状態をIsModified
にマークすると、false
をModified
に設定することはサポートされないことに注意してください。
あなたの目的のために、私は実際にデータベースからエンティティをロードし、通常の変更追跡を使用してそれを更新することを好むでしょう:
var objInDB = context.Objects.Single(o => o.Id == obj.Id);
obj.Property1 = objInDB.Property1;
obj.Property2 = objInDB.Property2;
context.Entry(objInDB).CurrentValues.SetValues(obj);
context.SaveChanges();
この質問はすでにうまく答えられましたが、私はそれを使いたい人に拡張メソッドを提供したかったです。
このコードはEF 4.3.1用に開発されました
//You will need to import/use these namespaces
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
//Update an entity object's specified columns, comma separated
//This method assumes you already have a context open/initialized
public static void Update<T>(this DbContext context, T entityObject, params string[] properties) where T : class
{
context.Set<T>().Attach(entityObject);
var entry = context.Entry(entityObject);
foreach(string name in properties)
entry.Property(name).IsModified = true;
context.SaveChanges();
}
使用例
using (FooEntities context = new FooEntities())
{
FooEntity ef = new FooEntity();
//For argument's sake say this entity has 4 columns:
// FooID (PK), BarID (FK), Name, Age, CreatedBy, CreatedOn
//Mock changes
ef.FooID = 1;
ef.Name = "Billy";
ef.Age = 85;
context.Update<FooEntity>(ef, "Name", "Age"); //I only want to update Name and Age
}
上記の回答(ほとんどの回答)ではDbContextを使用しています。 ObjectContextを使用しているユーザーは、これらのソリューションにアクセスできません。
ObjectContext厳密に(EF5 .NET 4.5)のソリューションを次に示します。
ctx.AddObject("ENTITYNAME", item);
ctx.ObjectStateManager.ChangeObjectState(item, EntityState.Modified);
var entry = ctx.ObjectStateManager.GetObjectStateEntry(item);
entry.RejectPropertyChanges("PROPERTY_TO_EXCLUDE");