簡體   English   中英

為什么EF6在子表中插入行時在父表中插入一行?

[英]Why does EF6 insert a row in parent table when inserting row in child table?

我有 2 個使用外鍵相互連接的數據庫表,我正在使用實體框架 6 和 Sqlite 使用以下模型創建此表。

public class IntegraPortal : BaseEntity
{
        
    public string Name { get; set; }

    public string DatabaseIp{ get; set; }
        
    public string DatabaseName{ get; set; }
        
    public string DatabaseLogin{ get; set; }
        
    public string DatabasePassword{ get; set; }

    #region Navigation
        
    public virtual List<Plc> Plcs{ get; set; }

    #endregion
}

public class Plc :  BaseEntity
{   

        public string Name{ get; set; }
        
        public string Ip{ get; set; }
        
        public int Slot{ get; set; }

        public int Mode{ get; set; }

        public string Craft{ get; set; }

        public string Area{ get; set; }

        public int IntegraPortalId { get; set; }

        #region Navigation
        
        public virtual IntegraPortal IntegraPortal { get; set; }

        #endregion
 }

Model 配置:

modelBuilder.Entity<IntegraPortal>();

modelBuilder.Entity<Plc>()
            .HasRequired(x => x.IntegraPortal)
            .WithMany(s => s.Plcs)
            .HasForeignKey(x => x.IntegraPortalId);

使用 EF6 生成的代碼:

public override void Up()
        {
            CreateTable(
                "dbo.IntegraPortals",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(maxLength: 2147483647),
                        DatabaseIp = c.String(maxLength: 2147483647),
                        DatabaseName = c.String(maxLength: 2147483647),
                        DatabaseLogin = c.String(maxLength: 2147483647),
                        DatabasePassword = c.String(maxLength: 2147483647),
                    })
                .PrimaryKey(t => t.Id);
            
            CreateTable(
                "dbo.Plcs",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Name = c.String(maxLength: 2147483647),
                        Ip = c.String(maxLength: 2147483647),
                        Slot = c.Int(nullable: false),
                        Mode = c.Int(nullable: false),
                        Craft = c.String(maxLength: 2147483647),
                        Area = c.String(maxLength: 2147483647),
                        IntegraPortalId = c.Int(nullable: false),
                    })
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.IntegraPortals", t => t.IntegraPortalId, cascadeDelete: true)
                .Index(t => t.IntegraPortalId, name: "IX_Plc_IntegraPortalId");

CreateTable(
                "dbo.History_82c009b41631-48579635f1ff64eb62d9",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        Hash = c.String(nullable: false, maxLength: 2147483647),
                        Context = c.String(maxLength: 2147483647),
                        CreateDate = c.DateTime(nullable: false),
                    })
                .PrimaryKey(t => t.Id);
            
        }

但是現在,如果我嘗試使用現有的 IntegraPortal(父)object 插入 PLC(子)object。 它創建一個新的父 object (復制現有的),具有新的 id 並在子表中引用該新 id。

我不想在父表中創建新行。 我只想在引用父表中現有行的子表中插入一個新行。

這就是我使用現有父 object 向子表插入新行的方式。 這里的配置是父表中現有行的 object。

var plc = new Plc();
plc.Name = reader[1].ToString();
plc.Ip = reader[2].ToString();
plc.Slot = Convert.ToInt32(reader[3]);
plc.Mode = Convert.ToInt32(reader[4]);
plc.Craft = reader[7].ToString();
plc.Area = reader[6].ToString();
plc.IntegraPortalId = config.Id;
plc.IntegraPortal = config;

dataAccess.AddPlc(plc);

想知道我在 model 配置或表創建中是否做錯了什么。 任何幫助表示贊賞。 TIA。

我已經通過刪除plc.IntegraPortal = config;解決了這個問題。 從代碼。

我不應該在孩子中給出父行 object (父表中的行)。 我應該只將父行的 id 作為子表的外鍵。

修改后的代碼:

var plc = new Plc();
plc.Name = reader[1].ToString();
plc.Ip = reader[2].ToString();
plc.Slot = Convert.ToInt32(reader[3]);
plc.Mode = Convert.ToInt32(reader[4]);
plc.Craft = reader[7].ToString();
plc.Area = reader[6].ToString();
plc.IntegraPortalId = config.Id; //foreign key -- parent table row id

dataAccess.AddPlc(plc);

這樣就不會在父表中添加重復行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM