C# Linq 有四个表和一个并不总是需要的外键

C# Linq with four tables and one foreign key that isn´t always needed

我有一个带有 HeidiSQL 的 MariaDB 数据库。有四个 table,我正在使用 Linq 插入新数据。 table 之一并不总是必需的。因此,我在另一个 table 之一中用外键标记了该列,因为它可以为 NULL。问题是,当我创建要插入数据库的新对象时,它会在数据库中创建新数据,但另一个 table 中的外键保持为空。 当我撤消列中的 Null 选项并想插入标准值时,它会抛出 UpdateEntityException。 我应该提到的是,我首先在 HeidiSQL 中创建了数据库,然后在 Visual Studio 和 EntityFramework 5.0 中创建了代码。 或者可能是由于在 if 子句中构建和添加数据库对象而导致的错误? 我的代码有一些代码示例,希望对您有所帮助。

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();
        }
    }

我解决了我的问题。我将外键字段从 can be NULL 更改为 is necessary,在 foreign table 中添加了一个 ID 为 0 的 costum 数据集,当新数据没有官方 link 时,我将此 ID 作为其外部 ID到国外table。这可能不是最好的解决方案,但它解决了我的问题。