[英]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.