0

我读到 EF 本身就是一个工作单元和存储库,所以我真的不想制作一个存储库层和另一个 UoW,除非确实有必要。

不过,我想知道这一点。我有城市服务和场地服务。

我有一个 FindVenue 方法

public void FindVenue()
{
    // find venue in db
    // If not in db - find from 3rd party api
    // If from 3rd party api check if city exits in db
   //  If city does not exist create a city record in db
   //  If venue does not exist create a new venue record in db
   context.SaveChanges();
}

现在我想知道 CreateCity 方法应该有 context.SaveChanges();还是应该将其添加到 DbSet 中,然后在 FindVenue 完成创建新场所时,它可以插入两条记录。

这样,只有 1 次调用 db,如果一次失败,它们都会被回滚(你当然可以说这些是分开的,如果可以插入城市,那么为什么不这样做)

我看到的一个问题是,如果其他人打电话说来自控制器的 CreateCity,因为我可以有一种直接的方式将 City 插入我的数据库,那么控制器将需要做context.SaveChanges()这将是不好的,否则我将不得不有一个名为 CreateAndSaveCity() 的新方法;

4

2 回答 2

0

我不建议您调用 save changes 而不是仅仅为了共享代码(即只调用一次FindVenue())。

为了解决想要拯救城市的其他方法的问题,这里有几个想法......

选项 1:创建一个 create city 的重载方法(就像你建议的那样CreateAndSaveCity),它将调用第一个方法CreateCity(不保存更改)然后保存更改

public void FindVenue()
{
    // find venue in db
    // If not in db - find from 3rd party api
    // If from 3rd party api check if city exits in db
    // If city does not exist...
    CreateCity(context);
    // If venue does not exist create a new venue record in db
    context.SaveChanges();
}

public void CreateCity(YourContext context)
{
    // Create city, don't save changes
}

public void CreateAndSaveCity(YourContext context)
{
    CreateCity();
    context.SaveChanges();
}

在这种情况下,如果你想从其他地方的控制器创建一个城市,你可以调用CreateAndSaveCity(context)

选项 2:CreateCity方法采用可选的布尔参数,指示是否应保存更改。根据您最常见的用例,您可以将可选参数的默认值设置为 true 或 false,或者如果您想确保始终明确指定它,则将其设为必需。

public void FindVenue()
{
    // find venue in db
    // If not in db - find from 3rd party api
    // If from 3rd party api check if city exits in db
    // If city does not exist...
    CreateCity(context);
    // If venue does not exist create a new venue record in db
    context.SaveChanges();
}

public void CreateCity(YourContext context, bool saveChanges = false)
{
    // Create city
    if (saveChanges) {
        context.SaveChanges();
    }
}

在这种情况下,如果你想从其他地方的控制器创建一个城市,你可以调用CreateCity(context, true)

就个人而言,我更喜欢选项 2,但这主要是语义问题。

另外,关于您的评论:

你当然可以说这些是分开的,如果可以插入城市,那么为什么不这样做

这取决于您的业务逻辑的需求。但即使在这种情况下,您仍然可以在检查是否应创建场地(并在需要时创建)后保存更改。如果您实际上不需要单独保存城市(例如,在插入后获取其 id 以设置外键),则没有理由进行数据库往返。

于 2013-10-10T17:48:59.193 回答
0

Do SaveChanges in CreateCity() and wrap it in a TransactionScope.

public void FindVenue()
{
   using (var trans = new TransactionScope()) {
       CreateCity();
       // some code to add your venue...
       // ...
       context.SaveChanges();
       trans.Commit();
   }
}
于 2013-10-10T18:01:29.410 回答