Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架保存/更新的单一方法_Entity Framework_Entity Framework 4 - Fatal编程技术网

Entity framework 实体框架保存/更新的单一方法

Entity framework 实体框架保存/更新的单一方法,entity-framework,entity-framework-4,Entity Framework,Entity Framework 4,问题是我试图找到一种方法来保存一个实体,无论是新实体还是已经加载的实体。大多数代码示例都使用单独的Add和Save方法,这与当前许多使用单个Save()方法的设计背道而驰 让我声明我已经阅读了其他帖子。我也看过团队博客上的repository模式,它有一个AddObject()方法,我似乎无法通过假设它只是一个Add(object)来找到它 如果我们加载一个对象并保存它,上下文就会知道它。 我们必须添加一个新对象。 如果我们添加一个现有的对象,它会将其作为插入发送过来 我想要一个保存过程。用户不

问题是我试图找到一种方法来保存一个实体,无论是新实体还是已经加载的实体。大多数代码示例都使用单独的Add和Save方法,这与当前许多使用单个Save()方法的设计背道而驰

让我声明我已经阅读了其他帖子。我也看过团队博客上的repository模式,它有一个AddObject()方法,我似乎无法通过假设它只是一个Add(object)来找到它

如果我们加载一个对象并保存它,上下文就会知道它。 我们必须添加一个新对象。 如果我们添加一个现有的对象,它会将其作为插入发送过来

我想要一个保存过程。用户不必知道如何调用Add或Update,Save()就足够了。话虽如此,对于采用相同方法(仅保存,不加载)的单个保存解决方案,这里的最佳路径是什么 1.加载实体,保存回数据库。 2.创建新实体,并将其保存到数据库。 所以我正在寻找一种在任何情况下都可以

ICustomerRepository.Save(Customer customer)
你会使用什么样的解决方案

下面Save(entity)方法中的代码似乎适合我


//If the primary key is empty, its a new record
if (order.OrderId == 0)
{
   _context.Orders.Add(order);
}

if (_context.Entry(order).State == System.Data.EntityState.Detached)
{
   //Need to set modified so any detached entities are updated otherwise they won't be sent across to the db. Since it would've been outside the context, change tracking wouldn't have occurred anyways so we have no idea about its state - save it!
   _context.Orders.Attach(order);
   _context.Entry(order).State = System.Data.EntityState.Modified;
}



然而,这里的问题是,对于通用存储库实现,如果不查询密钥是什么,然后通过不干净的反射检查其值,这里就没有明确的方法。

如果使用自跟踪实体,则该实体将跟踪状态并根据需要插入或更新,而不需要单独设置方法

通用存储库是童话故事。存储库模式的唯一有效用法是特定存储库,特定存储库知道密钥的类型及其默认值。同样,如果您的密钥不是在数据库中生成的,而是在应用程序中生成的,那么您可以抱怨您的通用代码将不起作用

EF不支持单一方法处理,不能简单地添加。要使其正常工作,您需要在SQL级别执行条件插入/更新(或在SQL server 2008中进行合并)。EF没有类似的功能,它将两个操作分离到命令执行

这意味着实现这一点的唯一方法是使用代码示例中显示的一些“知识”,或者通过单独的数据库调用或使用存储过程检查数据库中实体的存在

公共抽象类EntityObject
public abstract class EntityObject
{
    /*Allows for this:
        T UpdateOrInsert<T>(T item) where T : EntityObject
        {
            T foundItem = depDA.Set<T>().Find(item.EntityKey);
            return foundItem;
        }
    etc


     inherit entity partials from this

     partial class MyObject : EntityObject
     {
         override int EntityKey { get { return MyObjectID; } } 
     }

    */

    public abstract int EntityKey { get; }

}
{ /*考虑到这一点: T UpdateOrInsert(T项),其中T:EntityObject { T foundItem=depDA.Set().Find(item.EntityKey); 退货项目; } 等 从该文件继承实体部分 部分类MyObject:EntityObject { 重写int EntityKey{get{return MyObjectID;}} } */ 公共抽象int EntityKey{get;} }
将此方法弹出到帮助器类中

public static T SaveEntity<T>(T item, DbContext context) where T : EntityObject
{
    T foundItem = context.Set<T>().Find(item.EntityKey);
    if (foundItem == null)
    {
        //INSERT
        foundItem = context.Set<T>().Add(item as T);
    }
    else
    {
        //UPDATE
        foundItem = item;
    }
    context.SaveChanges();
    return foundItem;
}
publicstatict SaveEntity(T项,DbContext上下文),其中T:EntityObject
{
T foundItem=context.Set().Find(item.EntityKey);
if(foundItem==null)
{
//插入
foundItem=context.Set().Add(项作为T);
}
其他的
{
//更新
foundItem=项目;
}
SaveChanges();
退货项目;
}

问题是web应用程序不使用STE,另外还需要额外的t4模板,我希望无论如何都不要使用这些模板。这在MVC模型绑定中也会被否定。谢谢你的回复。哈童话故事?:)我见过一些泛型实现,它们使用泛型存储库和第二个接口实现来实现泛型接口所需之外的其他方法。为什么这会成为一个问题?(我为每个存储库使用了一个接口,但是已经看到了其他的实现)回到上面——所以基本上,我提供的是实现这一点的方法?似乎没有其他方法。由于EF希望为每个操作调用单独的方法,因此您将始终以类似于您显示的代码的方式结束。您正在谈论的存储库的实现是特定的存储库,因为第二个接口将添加特定的方法,并且每个实现也将能够对通用存储库定义的方法进行自己的特定实现。您使用哪种实现—单独的操作还是自定义方法(甚至不是EF?)当我使用EF时,我使用了一些类似于单独方法的方法-我遵循了EF的预期。此解决方案无法解决的问题是,您可能并不总是希望您的密钥是整数。另一个问题是,它迫使您再次访问数据库。