繁体   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