Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查数据库中是否存在数字,如果不存在,是否将数字分配给数据库对象?_C#_Asp.net Mvc_Random - Fatal编程技术网

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