实体框架4 POCO如何更新实体?

时间:2010-08-01 16:53:58

标签: entity-framework entity-framework-4

这是使用自我跟踪实体添加/更新实体的方法,使用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;
            }
        }

1 个答案:

答案 0 :(得分:4)

更新实体最直接的方法是通过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;
    }

请注意,此方法仅在数据库中已有此“英雄”且正在更新现有条目时才有效。你需要一个单独的方法来添加一个新的“英雄”。

相关问题