0

我有一个简单的关系:

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

4

5 回答 5

0

如果这是一家现有公司,请设置 CompantID 字段而不是实体

note.CompanyID = company.ID;
于 2012-07-24T11:49:37.073 回答
0

我认为问题在于在 FirstorDefault 方法中使用 note.Company.Id 时您的第一行。如果您可以发布条目方法,我可能会提供进一步的帮助。如果你有 companyId 作为参数进入方法,那么你可以修改上面的代码,如下所示:

Company company = db.Company.Find(companyId);
note.Company = company;
db.SaveChanges();

或者正如其他答案所建议的那样,只需设置 note.CompanyId

于 2012-07-24T11:50:22.430 回答
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

于 2012-07-24T11:50:53.860 回答
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();

        }
于 2012-07-24T11:56:12.583 回答
0

感谢大家的回复。

最后我的问题是,首先,在为页面创建模型时,我实例化了一个初始的新“公司”,所以我将公司设置为 null 以进行创建。

然后,在页面上,我有 Html.TextBoxFor(model => model.Company.CompanyName,....被传递回控制器。

在设置公司 ID 之前,我确实尝试将其设置为 null,但这不起作用。但是,删除上面的文本框,一切都开始工作了!

于 2012-07-24T12:18:52.750 回答