这是一种使用自跟踪实体添加/更新实体的方法,使用 POCO 的等效方法是什么?
public Hero SaveHero(Hero hero)
{
using (WarEntities model = new WarEntities())
{
if (hero.ChangeTracker.State == ObjectState.Added)
{
model.Heroes.AddObject(hero);
model.SaveChanges();
hero.AcceptChanges();
return hero;
}
else if (hero.ChangeTracker.State == ObjectState.Modified)
{
model.Heroes.ApplyChanges(hero);
model.SaveChanges();
return hero;
}
else
return null;
}
}
最佳答案
更新实体最直接的方法是通过 Id 获取它,重写所有属性并调用 SaveChanges()
:
public Hero SaveHero(Hero hero)
{
using (WarEntities model = new WarEntities())
{
Hero dbHero = model.Heroes.FirstOrDefault(h => h.Id == hero.Id);
if (dbHero != null)
{
dbHero.Name = hero.Name;
dbHero.OtherProperties = hero.OtherProperties;
...
model.SaveChanges();
return dbHero;
}
else
{
model.Heroes.AddObject(hero);
model.SaveChanges();
return hero;
}
}
但是,您可以通过附加 POCO 实体并将其状态更改为 Modified
来避免从数据库获取实体:
public Hero SaveHero(Hero hero)
{
using (WarEntities model = new WarEntities())
{
model.Heroes.Attach(hero);
var heroEntry = model.ObjectStateManager.GetObjectStateEntry(hero);
heroEntry.ChangeState(EntityState.Modified);
model.SaveChanges();
return hero;
}
请注意,只有当数据库中已经有这个“英雄”并且正在更新现有条目时,此方法才有效。您将需要一个单独的方法来添加新的“英雄”。
关于entity-framework - Entity Framework 4 POCO如何更新实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3382871/