C# 检查数据库中是否存在数字,如果不存在,是否将数字分配给数据库对象?
我有一个生成随机订单号的方法,如果该编号不存在,则将该编号存储在数据库中 这样做对吗 我不确定是否应该编写C# 检查数据库中是否存在数字,如果不存在,是否将数字分配给数据库对象?,c#,asp.net-mvc,random,C#,Asp.net Mvc,Random,我有一个生成随机订单号的方法,如果该编号不存在,则将该编号存储在数据库中 这样做对吗 我不确定是否应该编写while(OrderNumber!=null)或while(OrderNumber==null) 这是我的代码: private string loadOrderNr() { using (Db db = new Db()) { Random rnd = new Random(); long part1 = rnd.Next(100000,
while(OrderNumber!=null)
或while(OrderNumber==null)
这是我的代码:
private string loadOrderNr()
{
using (Db db = new Db())
{
Random rnd = new Random();
long part1 = rnd.Next(100000, 999999);
long part2 = rnd.Next(1000, 9999);
string OrderNr = "CA-" + part1 + "-" + part2;
return OrderNr;
}
}
用于保存在数据库中
using (Db db = new Db())
{
string OrderNumber = loadOrderNr();
var CheckifOrderNrExist = db.CarAnn.Where(x => x.OrderNr == OrderNumber).FirstOrDefault();
do
{
OrderNumber = loadOrderNr();
}
while (CheckifOrderNrExist != null);
CarAnn ann = new CarAnn();
ann.Description = model.Description;
ann.Title = model.Title;
ann.OrderNr = OrderNumber;
db.CarAnn.Add(ann);
db.SaveChanges();
}
我不确定我的解决方案和do/while循环。只有当数字不存在时,您当前的代码才能工作。如果该数字存在,则进入无限循环,因为不更新变量CheckIfOrderNrExist 您应该在每次创建代码时更改代码以检查该数字,因此
string OrderNumber = loadOrderNr();
var CheckifOrderNrExist = db.CarAnn.FirstOrDefault(x => x.OrderNr == OrderNumber);
while(CheckIfOrderNrExist != null)
{
OrderNumber = loadOrderNr();
CheckifOrderNrExist = db.CarAnn.FirstOrDefault(x => x.OrderNr == OrderNumber);
}
另外,不要在循环中创建随机实例也很重要,因为您可能会得到相同的结果。最好将随机实例的创建作为类级变量
public class OrderDB
{
private Random rnd = new Random();
.... other class code....
private string loadOrderNr()
{
// Do you really use the Db variable here? Otherwise you can remove it
using (Db db = new Db())
{
// Random rnd = new Random();
long part1 = rnd.Next(100000, 999999);
long part2 = rnd.Next(1000, 9999);
string OrderNr = "CA-" + part1 + "-" + part2;
return OrderNr;
}
}
}
只有当号码不存在时,您当前的代码才有效。如果该数字存在,则进入无限循环,因为不更新变量CheckIfOrderNrExist 您应该在每次创建代码时更改代码以检查该数字,因此
string OrderNumber = loadOrderNr();
var CheckifOrderNrExist = db.CarAnn.FirstOrDefault(x => x.OrderNr == OrderNumber);
while(CheckIfOrderNrExist != null)
{
OrderNumber = loadOrderNr();
CheckifOrderNrExist = db.CarAnn.FirstOrDefault(x => x.OrderNr == OrderNumber);
}
另外,不要在循环中创建随机实例也很重要,因为您可能会得到相同的结果。最好将随机实例的创建作为类级变量
public class OrderDB
{
private Random rnd = new Random();
.... other class code....
private string loadOrderNr()
{
// Do you really use the Db variable here? Otherwise you can remove it
using (Db db = new Db())
{
// Random rnd = new Random();
long part1 = rnd.Next(100000, 999999);
long part2 = rnd.Next(1000, 9999);
string OrderNr = "CA-" + part1 + "-" + part2;
return OrderNr;
}
}
}
这就是我的方法 保持关注点的分离非常重要 因此,您必须编写一个服务类和一个接口,从中调用您的服务方法
public class IOrderService
{
string SetOrderNumber();
}
public class OrderService : IOrderService
{
private readonly Random random = new Random();
private string LoadOrderNr()
{
long part1 = rnd.Next(100000, 999999);
long part2 = rnd.Next(1000, 9999);
return "CA-" + part1 + "-" + part2;
}
public string SetOrderNumber()
{
var orderNumber = "";
do
{
orderNumber = LoadOrderNr();
}
while (db.CarAnn.Any(x => x.OrderNr == orderNumber));
return orderNumber;
}
}
在将OrderService添加到项目中后(可以位于服务层,也可以位于另一个名为Services
的文件夹中,该文件夹包含所有服务类和接口),您需要将该服务注入控制器
然后你可以简单地使用它。这是实现关注点分离的方法
控制器逻辑
using System.Web.Mvc;
using ExampleProject.Services;
namespace ExampleProject.Controllers
{
public class ExampleController : Controller
{
private IOrderService _orderService;
public ExampleController(IOrderService orderService)
{
_orderService = orderService;
}
public ActionResult Post(Model model)
{
using (Db db = new Db())
{
var ann = new CarAnn()
{
Description = model.Description;
Title = model.Title;
OrderNr = _orderService.SetOrderNumber();
};
db.CarAnn.Add(ann);
db.SaveChanges();
}
return Ok();
}
}
}
在我看来,数据库上下文也应该被注入——但老实说,我不知道如何做到这一点。我更熟悉ASP.NET-Core
有关依赖项注入的更多信息,请查看此处:这将是我的方法 保持关注点的分离非常重要 因此,您必须编写一个服务类和一个接口,从中调用您的服务方法
public class IOrderService
{
string SetOrderNumber();
}
public class OrderService : IOrderService
{
private readonly Random random = new Random();
private string LoadOrderNr()
{
long part1 = rnd.Next(100000, 999999);
long part2 = rnd.Next(1000, 9999);
return "CA-" + part1 + "-" + part2;
}
public string SetOrderNumber()
{
var orderNumber = "";
do
{
orderNumber = LoadOrderNr();
}
while (db.CarAnn.Any(x => x.OrderNr == orderNumber));
return orderNumber;
}
}
在将OrderService添加到项目中后(可以位于服务层,也可以位于另一个名为Services
的文件夹中,该文件夹包含所有服务类和接口),您需要将该服务注入控制器
然后你可以简单地使用它。这是实现关注点分离的方法
控制器逻辑
using System.Web.Mvc;
using ExampleProject.Services;
namespace ExampleProject.Controllers
{
public class ExampleController : Controller
{
private IOrderService _orderService;
public ExampleController(IOrderService orderService)
{
_orderService = orderService;
}
public ActionResult Post(Model model)
{
using (Db db = new Db())
{
var ann = new CarAnn()
{
Description = model.Description;
Title = model.Title;
OrderNr = _orderService.SetOrderNumber();
};
db.CarAnn.Add(ann);
db.SaveChanges();
}
return Ok();
}
}
}
在我看来,数据库上下文也应该被注入——但老实说,我不知道如何做到这一点。我更熟悉ASP.NET-Core
有关依赖项注入的更多信息,请查看此处:为什么要这样做?当所有值都已存在于数据库中时,您将怎么做?在这种情况下,在循环内部创建
Random
,您将得到无休止的循环。它可能会导致重复,因为它的种子是DateTime
。相反,在循环之前在更高级别上创建Random
,我也认为有必要在loadOrderNr
方法中使用(Db Db=new Db())。因为它与数据库没有任何关系。首先,您不需要loadOrderNr
方法中的DB
实例(您从未访问过它),所以您应该删除它。第二,C#中的方法应该是PascalCase。这意味着您的方法应该被调用LoadOrderNr
。最后(也是最重要的)不要每次你想要一个新的随机数时都声明一个新的Random
实例!如果您在同一~15毫秒内请求几个随机数(在您的情况下很可能),您每次都会得到相同的数,因为默认情况下,random
类是如何播种的。使用单个随机实例。为什么要这样做?当所有值都已存在于数据库中时,您将怎么做?在这种情况下,在循环内部创建Random
,您将得到无休止的循环。它可能会导致重复,因为它的种子是DateTime
。相反,在循环之前在更高级别上创建Random
,我也认为有必要在loadOrderNr
方法中使用(Db Db=new Db())
。因为它与数据库没有任何关系。首先,您不需要loadOrderNr
方法中的DB
实例(您从未访问过它),所以您应该删除它。第二,C#中的方法应该是PascalCase。这意味着您的方法应该被调用LoadOrderNr
。最后(也是最重要的)不要每次你想要一个新的随机数时都声明一个新的Random
实例!如果您在同一~15毫秒内请求几个随机数(在您的情况下很可能),您每次都会得到相同的数,因为默认情况下,random
类是如何播种的。使用单个随机实例。Greate,非常感谢各位!不能排除问题中的基本错误!想解释一下吗?看看我的解决方案<例如,对于loadedOrderNumber()
,不需要使用DB DB。代码不是很干净,你在重复你的逻辑。您不需要变量OrderNr
或CheckIfOrderNrExist
,从“理论”的角度来看,您是正确的。但我发现这种方法更符合我的想法。Greate,非常感谢大家!不能排除问题中的基本错误!想解释一下吗?看看我的解决方案<例如,代码>不需要使用DB