我在使用实体框架保存对象时遇到问题。我正在使用Webforms,以下是我的代码设置方式:
我的AppSettings
有一个AddressId
。我更喜欢单独保存它们。因此AppSettings
保存AppSettingRepo
,Address
保存AddressRepo
。
代码隐藏:
AppSetting appSettings = AdminService.GetAppSettings();
//SET APP SETTING PROPERTIES
Address address = AdminService.GetAddressById(appSettings.AddressId);
//SET APP SETTING ADDRESS PROPERTIES
AdminService.SaveAppSettings(appSettings);
AdminService.SaveAddress(address);
AppSetting
存储库(我的AddressRepository
看起来完全一样):
public static void Save(Data.AppSetting appSettings)
{
using (var context = new AppContext())
{
if (appSettings.Id == 0)
{
context.AppSettings.Add(appSettings);
}
else
{
context.AppSettings.Attach(appSettings);
context.Entry(appSettings).State = EntityState.Modified;
appSettings.DateModified = DateTime.Now;
}
context.SaveChanges();
}
}
错误:
类型' System.InvalidOperationException'的例外情况发生在 EntityFramework.dll但未在用户代码中处理
附加信息:附加类型的实体 ' App.Data.AppSetting'失败,因为另一个相同类型的实体 已经具有相同的主键值。使用时会发生这种情况 '附加'方法或将实体的状态设置为“未更改”#39;要么 '变形'如果图表中的任何实体具有冲突的键值。
答案 0 :(得分:0)
我发现我正在使用AutoMapper并且映射方向错误。
无需同时附加和设置状态。
创建时:
context.Entry(object).State = EntityState.Added;
更新时:
context.Entry(object).State = EntityState.Modified;