我有一个简单的关系:
我有一个“Note”对象,它有一个相关的“Company”对象。 创建“注释”时,选择现有的“公司”,然后输入其他必要字段。
我的问题是,每当我保存时,它会插入新版本的“公司”对象,我无法弄清楚原因。
我已经尝试了 Insert new object with existing object中接受的答案中的所有选项,但没有任何效果。
目前,我正在做以下事情:
var company = db.Company.FirstOrDefault(i => i.ID == note.Company.ID);
note.Company = company;
db.Notes.AddObject(note);
db.ObjectStateManager.ChangeObjectState(company, EntityState.Unchanged);
db.ObjectStateManager.ChangeObjectState(note, EntityState.Added);
db.SaveChanges();
但是,它不断添加一个新的“公司”对象。奇怪的是,它不会添加所有字段,只添加CompanyName“字段,(并创建新的Id)。
答案 0 :(得分:0)
如果这是现有公司,请设置CompantID字段而不是实体
note.CompanyID = company.ID;
答案 1 :(得分:0)
我认为使用firstorDefault方法时使用note.Company.Id时问题出在你的第一行。如果您可以发布entrie方法,我可以进一步提供帮助。如果您将companyId作为参数进入方法,那么您可以按如下方式重新编写上述代码:
Company company = db.Company.Find(companyId);
note.Company = company;
db.SaveChanges();
或者正如另一个答案建议只设置note.CompanyId
答案 2 :(得分:0)
问题是您正在创建Note
的新实例并设置Company
属性因此我假设EF正在重新创建公司记录。如果您尝试将Note
链接到现有Company
对象,则只需在注释中设置公司的外键,例如
var company = db.Company.FirstOrDefault(i => i.ID == note.Company.ID);
note.CompanyID = company.ID; // will link the note to the specified company
db.Notes.AddObject(note);
db.SaveChanges();
使用note.Company.ID
将公司拉下来也没有任何意义,如果属性为null
,则此属性应为Note
。
答案 3 :(得分:0)
这是我如何做到的,希望它有所帮助。
using (DataContext dtx = new DataContext()) {
Note note = new Note();
dtx.Notes.Add(note);
Company company = dtx.Companies.FirstOrDefault((System.Object obj) => obj.ServerId == 1);
note.Server = company;
dtx.SaveChanges();
}
答案 4 :(得分:0)
感谢每一位回复。
我的问题最终是,首先,在为页面创建模型时,我实例化了一个初始的新“公司”,因此我将公司设置为null以进行创建。
然后,在页面上,我有Html.TextBoxFor(model => model.Company.CompanyName,....(这是一个自动完成的ajax文本框,在选择时设置隐藏的companyID字段),这意味着新的公司对象被传递回控制器。
我在设置公司ID之前尝试将此设置为null,但这不起作用。 但是,删除上面的文本框,一切都开始工作了!