gpt4 book ai didi

entity-framework - 用于保存/更新的 Entity Framework 单一方法

转载 作者:行者123 更新时间:2023-12-04 07:24:44 27 4
gpt4 key购买 nike

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

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

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

我在这里想要一个保存程序。用户不必知道调用添加或更新,一个 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;
}


虽然这里的问题是通用存储库实现,但这里没有明确的方法而不查询键是什么并通过不干净的反射检查它的值。

最佳答案

通用存储库是童话。存储库模式的唯一有效用法是特定存储库,特定存储库知道键是什么类型以及它的默认值是什么。同样,如果您的 key 不是在数据库中而是在应用程序中生成,您可以提示您的通用代码将无法工作。

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

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

关于entity-framework - 用于保存/更新的 Entity Framework 单一方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7575031/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com