使用多个edmx的Entity Framework

8

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

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

我考虑为每个模式创建一个edmx,但想知道这将如何影响unitorwork模式。通过阅读一些文章,ObjectContext将是unitofwork。通过定义2个edmx,我将最终拥有2个ObjectContext:HumanRessourceContext和InventoryContext,这意味着每个都将是unitofwork。如果我希望对humanressource和inventorycontext中的实体进行的所有修改都是原子性的,那么可以使用unitofwork模式实现吗?


还可以看看我的上一个问题Entity Framework中的多个模式 - MorbidCamel
2个回答

7

虽然这并不是将数据库按模式分割为EDMX的推荐做法,但您可以通过使用TransactionScope使更新过程变得原子化:

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

        hr.SaveChanges();
    }

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

        inv.SaveChanges();
    }

    trans.Complete();
}

显然,您可以随意重新排列上下文对象(例如,如果您需要同时使用它们),并将事务隔离级别更改为适当的级别,但这应该为您提供了所需的知识,以使您的数据库更改具有原子性。


好的,谢谢。我试图避免使用事务范围(TransactionScope)。所以,基本上唯一可行的方法是拥有一个包含所有人力资源和库存元素的单个EDMX文件,这样UnitOfWork模式就能正常工作。 - pdiddy
@pdiddy:你为什么要避免使用TransactionScope? - Adam Robinson
我之前以为使用UnitOfWork模式可以避免使用TransactionScope,因为在调用SaveChanges时,所有对对象的操作都会被发送到一个事务中。所以我开始想如果我有两个上下文,UnitOfWork模式会如何工作,但是我发现我必须使用TransactionScope来使这两个上下文原子化,这很合理。我对这个UnitOfWork模式还不熟悉,所以我只是在尝试理解它。 - pdiddy

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

1
这更多关乎结构,将其组织在我的项目中...将所有内容放在一个单独的edmx文件中,比如说我有50个表格...在一个单独的edmx文件中...它有点沉重,只是在设计师中打开它可能会令人困惑,因为有太多东西...但如果这会给我带来问题,我宁愿将其放在一个单独的edmx文件中。谢谢。 - pdiddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接