2016-11-15 11 views
0

私はHeidiSQLでMariaDBデータベースを持っているという問題があります。 4つのテーブルがあり、新しいデータを挿入するためにLinqを使用しています。テーブルの1つはいつも必要ではありません。だから私は他のテーブルのいずれかのNULLにすることができますの外来キーで列をマークした。問題は、データベースに挿入する新しいオブジェクトを作成するときにデータベースに新しいデータを作成するが、他のテーブルの外部キーがemtpyを保持するということです。 カラムのNullオプションを元に戻して、代わりに標準値を挿入すると、UpdateEntityExceptionがスローされます。 私が言及する必要があるのは、データベースを最初にHeidiSQLで作成し、Visual StudioでEntityFramework 5.0でコードを作成したことです。 または、データベースオブジェクトを構築してif節に追加することによって間違っている可能性がありますか? 私のコードのいくつかのコード例があります。C#Linqと4つのテーブルと1つの外部キーが必要です。

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

私は私の問題を解決しました。私はforeignテーブルのフィールドをNULLに変更する必要があります。外部テーブルに追加されたIDを持つcostumデータセットは0です。外部テーブルへの公式なリンクがない場合、外部IDとしてこのIDに新しいデータを与えます。それは最良の解決策ではないかもしれませんが、私の問題は解決しました。

関連する問題