我有两种类型
public class Division
{
public Division()
{
SubDiv = new List<EFTest.SubDivision>();
}
public int ID { get; set; }
public string name { get; set; }
public List<SubDivision> SubDiv { get; set; }
}
public class SubDivision : DomainObject
{
public int Id { get; set; }
public string name { get; set; }
}
现在我已经在数据库中添加了一个已加载它的分区,并希望通过以下代码为其添加新的SubDivision。
Division div = c.Divisions.Include(x => x.SubDiv).First();
SubDivision sub = new EFTest.SubDivision() { name = "d" };
div.SubDiv.Add(sub);
c.SubDivisions.Add(sub);
c.SaveChanges();
这段代码的作用是它在数据库中添加了一个新的SubDivision,但是将DivisionId(FK列)列设置为NULL。那么如何让EF识别并插入Division和SubDivision之间的关系而不必将FK字段的导航属性添加到SubDivision类?
答案 0 :(得分:1)
你的模特很好。问题不同。
您似乎已关闭了上下文更改跟踪功能。我无法使用&#34;标准&#34;重现问题。 (默认)上下文设置(使用正确的FK插入新记录,甚至删除正常冗余的c.SubDivisions.Add(sub);
行),但是一旦我执行了c.Configuration.AutoDetectChangesEnabled = false;
,则没有插入任何记录(当删除上述内容时)冗余线),或者使用原始代码,记录是用NULL
FK插入的。
要获得所需的行为,请保持更改跟踪:
c.Configuration.AutoDetectChangesEnabled = true; // <--
Division div = c.Divisions.Include(x => x.SubDiv).First();
SubDivision sub = new EFTest.SubDivision() { name = "d" };
div.SubDiv.Add(sub);
c.SaveChanges();
或在DetectChanges
之前明确调用SaveChanges
:
c.Configuration.AutoDetectChangesEnabled = false; // <--
Division div = c.Divisions.Include(x => x.SubDiv).First();
SubDivision sub = new EFTest.SubDivision() { name = "d" };
div.SubDiv.Add(sub);
c.ChangeTracker.DetectChanges(); // <--
c.SaveChanges();