====== 微软数据访问教程中有关业务逻辑执行的问题 ======

愚者只看星不看答案 愚者只看星不看答案 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
原文(实际是翻译后转载的)链接

https://www.jb51.net/article/83252.htm

文章比较长,业务规则是:

如果一个供应商仅仅供应一个产品的话,那么修改产品的信息的时候,是不能将这个产品的状态设置为停用.

不用太纠结是哪种语言,也不用太纠结细节。。。

代码如下:


public bool UpdateProduct(string productName, int? supplierID, int? categoryID, string quantityPerUnit,
decimal? unitPrice, short? unitsInStock, short? unitsOnOrder, short? reorderLevel,
bool discontinued, int productID)
{
Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
if (products.Count == 0)
// 根据productID查找时,没有找到匹配项,返回false
return false;


// product 即表示 Product 表中的一条记录
Northwind.ProductsRow product = products[0];

// 业务规则检查 – 不能停用某供应商所提供的唯一一个产品
if (discontinued)
{
// 获取我们从这个供应商处获得的所有产品
Northwind.ProductsDataTable productsBySupplier = Adapter.GetProductsBySupplierID(product.SupplierID);

if (productsBySupplier.Count == 1)
// 这是我们从这个供应商处获得的唯一一个产品,如果仅仅供应 1 个产品,则抛出异常
throw new ApplicationException("You cannot mark a product as discontinued if its the only product purchased from a supplier");
}

product.ProductName = productName;
if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value;
if (categoryID == null) product.SetCategoryIDNull(); else product.CategoryID = categoryID.Value;
if (quantityPerUnit == null) product.SetQuantityPerUnitNull(); else product.QuantityPerUnit = quantityPerUnit;
if (unitPrice == null) product.SetUnitPriceNull(); else product.UnitPrice = unitPrice.Value;
if (unitsInStock == null) product.SetUnitsInStockNull(); else product.UnitsInStock = unitsInStock.Value;
if (unitsOnOrder == null) product.SetUnitsOnOrderNull(); else product.UnitsOnOrder = unitsOnOrder.Value;
if (reorderLevel == null) product.SetReorderLevelNull(); else product.ReorderLevel = reorderLevel.Value;
product.Discontinued = discontinued;

// 更新产品记录
int rowsAffected = Adapter.Update(product);

// 如果刚好更新了一条记录,则返回true,否则返回false
return rowsAffected == 1;
}


这里的问题是当执行 if (productsBySupplier.Count == 1) 时,此供应商供应了 2 个产品。继续执行 product.ProductName = productName; 时,

在另一个CPU核心上,或是单核发生线程切换时,另一个用户删除了该供应商的一个产品的代码被完整的执行了。此时该供应商供应的产品数量为 1,

那么接下来的逻辑将继续执行,但是这个供应商仅仅供应 1个产品了,却执行了 停用 ,也就违反了业务规则 。

第一个问题,是不是将业务逻辑放到存储过程里来解决而不是应用层来解决更好

第二个问题,如果根本上解决这个问题?

多谢。
...全文

相关推荐

什么是三层架构_表现层/业务逻辑层/数据访问层

表现层不应包含任何业务逻辑或直接的数据访问。2. 业务逻辑层应独立于UI和数据存储,只提供API接口供其他层调用。3. 数据访问层应抽象化,使其可以轻松替换不同的数据存储技术。4.

zx198799

微软企业库5.0应用教程及实践

微软企业库(Microsoft Enterprise Library)是一个开源的软件框架,由一系列的应用程序块组成,旨在简化企业级应用的开发和维护。企业库提供了一组可重用的类和接口,覆盖了日志记录、缓存、异常处理、数据访问等常见问题的解决方案。通过这种方式,开发团队可以减少重复代码的编写,专注于核心业务逻辑的实现。配置管理应用块(Configuration Management Application Block)是微软企业库的一个组成部分,旨在为软件系统提供一个统一的配置管理机制。

背离赤道逆光而行

微软的机器人仿真软件microsoft robotics studio教程

**社区支持**:微软机器人工作室拥有活跃的开发者社区,用户可以在这里分享经验、解决问题,促进了技术的交流和进步。

汪中易

微软账号怎么注册 Microsoft帐户注册使用教程.docx

"微软账号怎么注册Microsoft帐户注册使用教程"微软账号是微软公司提供的一个统一身份验证服务,允许用户访问各种微软服务,如Windows 10操作系统、Office 365、OneDrive

Lidx0710

Microsoft Speech SDK安装包及博客教程教程(语音识别)

本教程将引导你了解如何安装SDK并利用其进行语音识别应用的开发。首先,安装Microsoft Speech SDK是一个必要的步骤。

Michael__csdn
评论 3
收藏 已收藏
分享
返回顶部
愚者只看星不看答案
C# 111,128 成员 642,536 内容