使用Attach / Modified将对象保存到Entity Framework 6的数据库中

时间:2015-02-28 05:49:03

标签: asp.net-mvc entity-framework webforms entity-framework-6 dbcontext

我在使用实体框架保存对象时遇到问题。我正在使用Webforms,以下是我的代码设置方式:

我的AppSettings有一个AddressId。我更喜欢单独保存它们。因此AppSettings保存AppSettingRepoAddress保存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;要么   '变形'如果图表中的任何实体具有冲突的键值。

1 个答案:

答案 0 :(得分:0)

我发现我正在使用AutoMapper并且映射方向错误。

无需同时附加和设置状态。

创建时:
context.Entry(object).State = EntityState.Added;

更新时:
context.Entry(object).State = EntityState.Modified;