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