2016-11-15 12 views
0

我有问题,我有一个MariaDB数据库和HeidiSQL。有四个表格,即时通讯使用Linq插入新数据。其中一张桌子并不总是必要的。所以我用另外一个表中的外键标记列可以为NULL。问题是,当我创建新的对象插入到数据库时,它会在数据库中创建新的数据,但其他表中的外键保持默认。 当我撤消列中的Null选项并且想要插入标准值时,它会引发UpdateEntityException。 我应该提及的是,我先在HeidiSQL中建立数据库,然后用EntityFramework 5.0在Visual Studio中创建代码。 或者可能由于在if子句中构建和添加数据库对象而导致错误? 我的代码有一些代码示例,我希望它会有所帮助。有四个表和一个并不总是需要的外键的C#Linq

DateTime aktuellesDatum = DateTime.Now; 
     int proId = getProjectIdByProjectnumber(zeichnungen[0].Projektnummer); 
     int tagId = getTagIdByTag(zeichnungen[0].Tag, zeichnungen[0].Projektnummer); 
     string hauptzeichnung = ""; 
     int gruppeId = -1; 
     //Noch kein Projekt vorhanden 
     if(proId == -1) 
     { 
      using (DMSContext db = new DMSContext()) 
      { 
       foreach (ZeichnungInDB zeichnungInDB in zeichnungen) 
       { 
        zeichnungInDB.Volante_Index = getVolCountByDrawingNumber(zeichnungInDB.Zeichnungsnummer) + 1; 
        var zeichnung = new zeichnung() 
        { 
         Zeichnung_ID = zeichnungInDB.Dateiname + "_" + zeichnungInDB.Index + "_VOL_" + zeichnungInDB.Volante_Index + "_" + aktuellesDatum.ToShortDateString(), 
         Zeichnungsnummer = zeichnungInDB.Zeichnungsnummer, 
         Index = zeichnungInDB.Index, 
         Zeitstempel = aktuellesDatum, 
         Dateiname_Org = zeichnungInDB.Dateiname, 
         Aenderung_Ext = zeichnungInDB.Aenderung_Ext, 
         Aenderung_Int = "AE_" + zeichnungInDB.Projektnummer + "_" + aktuellesDatum.Year + "-" + aktuellesDatum.Month + "-" + aktuellesDatum.Day + " " + aktuellesDatum.Hour + ":" + aktuellesDatum.Minute, 
         Dokumententyp = zeichnungInDB.DokumentenTyp, 
         Dateiendung = zeichnungInDB.Extension, 
         Volante_Index = zeichnungInDB.Volante_Index, 
         MMS_Sachmerkmal = zeichnungInDB.Mms_Sachmerkmal, 
         Status = zeichnungInDB.Status, 
         Aenderung_Bemerkung_Txt = zeichnungInDB.Aenderung_Bemerkung_Text, 
         Einzel_Bemerkung_Txt = zeichnungInDB.Einzel_Bemerkung, 
         Ahang_Link = zeichnungInDB.Anhang_Link, 
         Einzel_Link = zeichnungInDB.Einzel_Link, 
        }; 

        db.zeichnungs.Add(zeichnung); 

        if(zeichnungInDB.Baugruppe_Hauptzeichnung == true) 
        { 
         hauptzeichnung = zeichnungInDB.Zeichnungsnummer; 
        } 
       } 
       var projekt = new projekt() 
       { 
        Projektnummer = zeichnungen[0].Projektnummer, 
       }; 

       var tag = new tag() 
       { 
        Tag1 = zeichnungen[0].Tag, 
       }; 

       if (!hauptzeichnung.Equals("")) 
       { 
        var baugruppe = new baugruppe 
        { 
         Hauptzeichnung = hauptzeichnung, 
        }; 
        db.baugruppes.Add(baugruppe); 
       } 

       db.projekts.Add(projekt); 
       db.tags.Add(tag); 

       try 
       { 
        db.SaveChanges(); 
       } 
       catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) 
       { 
        Exception raise = dbEx; 
        foreach (var validationErrors in dbEx.EntityValidationErrors) 
        { 
         foreach (var validationError in validationErrors.ValidationErrors) 
         { 
          string message = string.Format("{0}:{1}", 
          validationErrors.Entry.Entity.ToString(), 
          validationError.ErrorMessage); 
          // raise a new exception nesting 
          // the current instance as InnerException 
          raise = new InvalidOperationException(message, raise); 
         } 
        } 
        throw raise; 
       } 
      } 

这只是一个简短的例如从我的代码,因为整个CS会很长,没有人会花时间在这么多的代码。

我想问的另一件事是。如果以下代码正确地更新字段中的字符串?

private static void updateHauptzeichnung(int baugruppeId, string zeichnungsnummer) 
    { 
     using (var context = new DMSContext()) 
     { 
      var query = context.baugruppes 
       .Where(b => b.Baugruppe_ID == baugruppeId) 
       .Select(g => new { g.Hauptzeichnung }) 
       .SingleOrDefault(); 

      if (query != null) 
      { 
       query.Hauptzeichnung.Replace(query.Hauptzeichnung, zeichnungsnummer); 
      } 

      context.SaveChanges(); 
     } 
    } 
+0

噪音太大。核心问题是(我认为)*我创建了要插入数据库的新对象,它在数据库中创建新数据,但其他表中的外键保留了emtpy *。我无法看到与代码片段的连接。这需要[mcve](http://stackoverflow.com/help/mcve)。 –

+0

向我们展示生成的SQL代码。 –

回答

1

我解决了我的问题。我将foreignkey字段从NULL更改为必需的,在外部表中添加ID为0的costum数据集,并且当它们没有正式链接到外部表时,我将新ID作为其外部ID。这可能不是最好的解决方案,但它解决了我的问题。

相关问题