C# 通用实体保存方法不起作用?

C# 通用实体保存方法不起作用?,c#,asp.net-mvc-3,entity-framework,C#,Asp.net Mvc 3,Entity Framework,为了减少我使用的代码和类的数量,我得到了以下方法: public TEntity Save(TEntity entity) { var validatationErrors = Entities.GetValidationErrors().ToList(); if (validatationErrors.Count() > 0) throw new Validat

为了减少我使用的代码和类的数量,我得到了以下方法:

public TEntity Save(TEntity entity)
            {
                var validatationErrors = Entities.GetValidationErrors().ToList();
                if (validatationErrors.Count() > 0)
                    throw new ValidateException(validatationErrors);

                if (Entities.Entry(entity).State == EntityState.Added)
                    Entities.Set<TEntity>().Add(entity);
                else
                    Entities.Set<TEntity>().Attach(entity);

                Entities.SaveChanges();
                Entities.Entry(entity).Reload();
                return entity;
            }
这似乎效率很低。
因此,我想知道通用保存的问题是什么,它不能工作?

如果您创建了一个新实体,您应该使用.Add方法。如果您知道数据库中存在一个对象,并且希望避免访问数据库以获取该对象,则应使用Attach

此外,通用保存方法似乎存在一些问题:

  • 除非明确禁用验证,否则将多次验证实体,因为默认情况下,SaveChanges()将验证实体
  • 如果实体处于添加状态,则上下文已跟踪该实体,因此无需再次添加该实体
  • .SaveChanges()将尝试保存上下文跟踪的所有未处于未更改状态的实体。该方法给人的印象是,它将只保存您传递的实体,但实际上它可能会保存更多
  • 我认为调用DbEntityEntry.Reload()只对附加的实体使用数据库中的值更新属性值有意义-如果您总是这样做,那么我想知道为什么要附加实体,而不仅仅是从数据库中获取它
      • 你的代码错了。在您的情况下,您不需要附加实体。您只需
        将您的实体添加到
        数据库集

                public TEntity Save(TEntity entity)
                {
                    Entities.Set<TEntity>().Add(entity);        
                    Entities.SaveChanges();
                }
        

      您是否已将状态设置为添加/修改?也就是说,is
      Entities.Entry(entity).State
      =
      EntityState.Added
      EntityState.Modified
      ?在哪里设置?我目前正在通过控制器操作进行设置,但这似乎效率很低。对。因此有一个.Add方法,但会跳过EntityState.Added条件。这种方法不节省额外的东西,根本不节省任何东西。理想情况下,save方法应该能够处理创建和更新。但我同意这个设计有问题。我只是不知道如何创建新实体和更新编辑的实体。如果有新实体,只使用Enities.Set().Add()。如果您修改了实体属性,并且跟踪了实体(即,您首先从数据库中获取实体),则无需执行任何操作。当您调用.SaveChanges()时,EF应该发现它已被修改,并且更改(以及新实体)应该保存到数据库中。老实说,我不确定我会使用泛型方法。所以你认为为每个实体创建一个save方法会更明智吗?我认为你不需要这个方法。您可能只想创建一个通用方法,根据实体的类型获取正确的DbSet,以便能够将实体添加/附加到集合中,但我怀疑您是否也需要这样做,因为您可以使用另一个采用类型的DbContext.set重载。我不完全了解您正在尝试做什么,但一般来说,您应该从数据库中获取实体(如果需要),根据需要修改和/或添加和/或删除实体。调用SaveChanges来持久化所有更改,而不仅仅是单个实体的更改(无论如何它都会保存所有更改)。如何正确地条件化添加?因为如果没有条件,你会在编辑实体时添加一个新的实体实例。好吧,但由于它是通用的,你不能从实体中提取Id,因为你实际上不知道它是哪个实体。拉动整个实体
      Entities.Set().Find(实体)。您可以从一个基类继承实体类并编写以下命令:“public class yourclass hatchains savemethod where tenty:BaseClass”并使用基类Id。或者您可以执行类似操作:“public tenty Save(tenty Entity,int Id)”
      
              public TEntity Save(TEntity entity)
              {
                  Entities.Set<TEntity>().Add(entity);        
                  Entities.SaveChanges();
              }
      
          public TEntity Save(TEntity entity)
          {
      
              var dbEntity = Entities.Set<TEntity>().Find(entity.Id);
      
              if (dbEntity != null)               
                  dbEntity = entity;
              else
                  Entities.Set<TEntity>().Add(entity);
      
              Entities.SaveChanges();
          }