【问题标题】:Adding new item to naviguation properties doesn't create incremental int PK向导航属性添加新项目不会创建增量 int PK
【发布时间】:2019-05-24 13:59:44
【问题描述】:

情况如下:

我有一个为零件创建机器程序的服务器。我的基础架构如下所示:

  • WillyDemandes:请求为零件创建程序
  • WillyMachines(与 FK 的 WillyDemandes 相关):每个机器程序 为这部分创建的。
  • WillyResults(与 FK 的 WillyMachines 相关):每个警告, 结果,机器的输出。

服务器拉出第一个 WillyDemandes 进行处理:

    static public WillyDemandes GetFirst()
    {

        WillyDemandes willyDemandes;

        using (Info_IndusContext db = new Info_IndusContext())
        {
                willyDemandes = db.WillyDemandes
                    .Include(x => x.IdPartNavigation)
                    .Where(x => x.Statut == Statuts.EnTest.ToString() && x.Username == Environment.UserName)
                    .OrderBy(x => x.Priority)
                    .ThenBy(x => x.Id)
                    .FirstOrDefault();

            if (willyDemandes != null)
            {
                willyDemandes.Statut = Statuts.EnTraitement.ToString();
                willyDemandes.ServerName = Environment.MachineName;
                willyDemandes.DateDebut = DateTime.Now;
                db.SaveChanges();
            }
        }
        return willyDemandes;

    }

然后服务器向零件添加新机器(new WillyMachines to WillyDemandes)

    static public WillyMachines Create(WillyDemandes willyDemandes, string MachineName)
    {
        using (Info_IndusContext db = new Info_IndusContext())
        {
            WillyMachines willyMachines = willyDemandes.WillyMachines.Where(x => x.DocumentType == MachineName).FirstOrDefault();
            if (willyMachines == null)
            {
                willyMachines = new WillyMachines() { IdDemande = willyDemandes.Id, DocumentType = MachineName };
                willyDemandes.WillyMachines.Add(willyMachines);
            }

            willyMachines.DateDebut = DateTime.Now;
            willyMachines.DateFin = null;
            willyMachines.Performance = null;
            willyMachines.Statut = Statuts.EnTraitement.ToString();
            db.SaveChanges();

            return willyMachines;
        }
    }

问题是每当我执行前面的代码时,SaveChanges 都会说上下文没有改变,willyMachines 的 ID 保持在 0,而不是获取数据库应该给他的增量 ID。因此,我做了以下补丁作为解决方法(添加到 context.WillyMachines 而不是导航属性并刷新 WillyDemandes)

    static public WillyMachines Create(WillyDemandes willyDemandes, string MachineName)
    {
        using (Info_IndusContext db = new Info_IndusContext())
        {
            WillyMachines willyMachines = willyDemandes.WillyMachines.Where(x => x.DocumentType == MachineName).FirstOrDefault();
            if (willyMachines == null)
            {
                willyMachines = new WillyMachines() { IdDemande = willyDemandes.Id, DocumentType = MachineName };
                db.WillyMachines.Add(willyMachines);
            }

            willyMachines.DateDebut = DateTime.Now;
            willyMachines.DateFin = null;
            willyMachines.Performance = null;
            willyMachines.Statut = Statuts.EnTraitement.ToString();
            db.SaveChanges();
            willyDemandes = WillyDemandesController.Refresh(willyDemandes);
            return willyMachines;
        }
    }

    static public WillyDemandes Refresh(WillyDemandes willyDemandes)
    {
        using (Info_IndusContext db = new Info_IndusContext())
        {
            return db.WillyDemandes
                    .Include(x => x.IdPartNavigation)
                    .Include(x => x.WillyMachines).ThenInclude(x => x.WillyResults)
                    .Where(x => x.Id == willyDemandes.Id)
                    .FirstOrDefault();
        }
    }

为什么我的上下文没有看到 WillyDemandes 的变化?我应该事先将 WillyDemandes 附加到上下文中吗?我应该去找别的东西吗?我的解决方案可行吗?

谢谢

【问题讨论】:

    标签: c# sql-server entity-framework-core


    【解决方案1】:

    在第一种情况下,没有对象被添加到上下文中。如果没有找到记录,willyDemandes 只是一个包含null 的变量。将变量设置为某个值不会修改存储在该内存位置中的 指针 之外的任何内容。

    第一个sn-p相当于:

            WillyMachines willyMachines = willyDemandes.WillyMachines
                                                       .Where(x => x.DocumentType == MachineName)
                                                       .FirstOrDefault();
            if (willyMachines == null)
            {
                var otherMachines = new WillyMachines{ 
                   IdDemande = willyDemandes.Id, 
                   DocumentType = MachineName 
                   WillyMachines.Add(willyMachines);            
                   DateDebut = DateTime.Now;
                   DateFin = null;
                   Performance = null;
                   Statut = Statuts.EnTraitement.ToString()
               };
           }
           db.SaveChanges();
    

    应使用db.WillyMachines.Add(willyMachines); 将新对象添加到上下文中:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2011-11-18
      • 2013-04-15
      • 2015-02-24
      • 2014-12-23
      相关资源
      最近更新 更多