C# 具有多个edmx的实体框架

C# 具有多个edmx的实体框架,c#,.net,entity-framework,unit-of-work,C#,.net,Entity Framework,Unit Of Work,假设我的数据库中有多个db模式,例如:HumanResources和Inventory 在这些模式中,每个模式都包含多个表。您通常是将数据库拆分为多个edmx还是将所有内容都放在一个edmx中 我正在考虑为每个模式创建一个edmx,但不知道这将如何影响unitorwork模式。通过阅读一些文章,ObjectContext将成为工作单元。通过定义2个edmx,我将得到2个ObjectContext:HumanResourceContext和InventoryContext,这意味着每一个都将是一个

假设我的数据库中有多个db模式,例如:HumanResources和Inventory

在这些模式中,每个模式都包含多个表。您通常是将数据库拆分为多个edmx还是将所有内容都放在一个edmx中


我正在考虑为每个模式创建一个edmx,但不知道这将如何影响unitorwork模式。通过阅读一些文章,ObjectContext将成为工作单元。通过定义2个edmx,我将得到2个ObjectContext:HumanResourceContext和InventoryContext,这意味着每一个都将是一个工作单元。如果我希望对HumanResource中的一个实体和inventorycontext中的一个实体所做的所有修改都是原子的,那么这可以通过unitofwork模式实现吗?

虽然这不是认可将数据库按模式拆分为EDMX,但您可以使用
TransactionScope
使更新成为原子的:

using(TransactionScope trans = new TransactionScope())
{
    using(HumanResources hr = new HumanResources())
    {
        //...

        hr.SaveChanges();
    }

    using(Inventory inv = new Inventory())
    {
        //...

        inv.SaveChanges();
    }

    trans.Complete();
}

显然,您可以按照自己的喜好重新排列上下文对象(例如,如果您需要同时使用它们),并且您可以将事务隔离级别更改为任何适当的级别,但是,这应该为您提供使数据库更改原子化所需的知识。

如果您的库存表和人力资源表之间没有任何关系,将这些表拆分为两个edmx文件是可以的,尽管我不知道它会带来什么好处。如果他们确实有直接或间接的关系,你在尝试使用这些关系时会遇到问题。最简单的解决方案是使用单个EDM。

好的,谢谢,我试图避免transactionscope。因此,唯一可行的方法是使用一个edmx,其中包含人力资源和库存的所有元素,这样unitofwork模式就可以很好地工作。@pdiddy:为什么要避免TransactionScope?我对unitofwork模式的印象是,我可以避免TransactionScope,因为在调用savechanges时,对对象所做的一切都将在一个signe事务中发送。所以我开始想如果我有2个上下文,unitofwork模式将如何工作,但我看到我必须使用transactionscope使2个上下文原子化,这是有意义的。我对这种unitofwork模式还不熟悉,所以我只是想了解它。它更多的是关于结构,在我的项目中组织它。。。把所有东西都放在一个edmx中,假设我有50张桌子。。。在一个edmx中。。它有点重,只是在设计器中打开它可能会让人困惑,因为有太多。。。。但如果这会给我带来麻烦,我宁愿只买一个edmx。谢谢,请参见我的最后一个问题[实体框架中的多个模式][1][1]: