使用相关现有对象添加新对象会为现有对象插入新行

时间:2012-07-24 11:41:50

标签: c# .net entity-framework entity-framework-4

我有一个简单的关系:

我有一个“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)。

5 个答案:

答案 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,但这不起作用。 但是,删除上面的文本框,一切都开始工作了!