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

本文关键字:Linq 四个 一个 | 更新日期: 2023-09-27 18:17:56

我有一个问题,我有一个MariaDB数据库HeidiSQL。有四个表,我使用Linq来插入新的数据。其中一张表并不总是必需的。因此,我用外键标记了其他表中的列,因为可以为NULL。问题是,当我创建新对象插入数据库时,它会在数据库中创建新数据,但在其他表中的外键保持为空。当我撤消列中的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();
        }
    }

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

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