【问题标题】:entity framework add data to table实体框架向表中添加数据
【发布时间】:2016-11-09 14:27:51
【问题描述】:

我正在尝试在 Visual Studio 中使用 EntityFrameWork 5 将数据插入 MariaDB。我在服务器本身上创建了数据库,并在 Visual Studio 中导入了模型。我正在使用三个表,它们是链接的。

排水表、项目表和标签表。
实体为:drawing (many---1) project (1---many) tag。

对于插入,我使用下面的代码。但它会抛出一个 DbUpdateEntityException ,告诉他无法匹配绘图和项目表之间的键,因为两个或多个主键相同。我使用特定的主键进行数据绘图,这与表中的其他对象绝对不同。其他主键是 AUTO_INCREMENT 所以我猜它试图插入一个新项目,但项目编号相同但不起作用,但我真的不明白它为什么这样做。

DateTime aktuellesDatum = DateTime.Now;
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(),
            Baugruppe = zeichnungInDB.Baugruppe,
            Baugruppe_Hauptzeichnung = zeichnungInDB.Baugruppe_Hauptzeichnung,
            Zeichnungsnummer = zeichnungInDB.Zeichnungsnummer,
            Index = zeichnungInDB.Index,
            Dateiname_Org = zeichnungInDB.Dateiname,
            Aenderung_Ext = zeichnungInDB.Aenderung_Ext,
            Aenderung_Int = "AE_" + zeichnungInDB.Projektnummer + aktuellesDatum,
            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,
        };

        var projekt = new projekt()
        {
            Projektnummer = zeichnungInDB.Projektnummer,
        };

        var tag = new tag()
        {
            Tag1 = zeichnungInDB.Tag,
        };
       
        db.zeichnungs.Add(zeichnung);
        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;
    }
}

也许有人有问题所在的想法或解决方案。 (“ZeichnungInDB”是自定义对象,“zeichnungen”是 ObservableCollection)

另一个问题我有一个日期时间字段,即 CURRENT_TIMESTSAMP,但它只显示 0000-00-00 00:00:00 这是为什么?

【问题讨论】:

    标签: c# mysql entity-framework mariadb


    【解决方案1】:

    你在使用流畅的 API 吗?如果是,则应将 id 的属性标记为 Identity,如示例:

     Property(p => p.DrawingId).
                HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    

    或者您可以在实体的主键中使用注释进行标记,例如:

    public class drawing {
    
       [Key]
       [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
       public int ind DrawingId {get; set;}
       ....
    

    }

    链接: http://www.opten.ch/blog/2014/03/5/configuring-entity-framework-with-fluent-api/

    问候。

    【讨论】:

    • 我刚刚在 heidiSQL-Tool 中声明了数据库并在 Visual Studio 中生成了模型,这就是我所做的一切。但我会测试你的小费。
    猜你喜欢
    • 2018-08-24
    • 2022-10-14
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多