EntityFramework更新现有实体

时间:2012-01-19 10:23:19

标签: wpf entity-framework mvvm

WPF的MVVM-的EntityFramework

当我尝试更新MVMV WPF项目中的现有实体时,我遇到了问题 我有用户实体,其中有 UserApplication

的集合

UserApplication ServerId int ApplicationId int UserId int BinDirectory varchar(MAX)

用户 登录varchar(50) Id int

当我为我的用户添加新应用程序时,我需要在UserApplications表中添加一条记录。

在我的User模型类中有一个AddApplication方法

public void AddApplication (int appId, int serverId, string bin)
{
this.userApplications.add (new UserApplication(){
 ApplicationId = appId,
 ServerId = serverId,
 BinDirectory = bin,
 userId = this.Id
});
}

在我的视图模型中,有以下代码

this.currentUser.AddApplication(_currentApp.Id, _currentServer.Id, "my_directory");
userDao.Update(this.currentUser);

在userDao中

public int Update(User userToSave)
        {                
            using (Context dpEnt = new Context())
            {
                try
                {
                    dpEnt.Attach(userToSave);
                    return dpEnt.SaveChanges();
                }
                catch (Exception ex)
                {
                    _log.Error(ex.Message);
                    return -1;
                }
            }
        }

此处我在Attach调用上有以下异常:具有临时EntityKey值的对象无法附加到对象上下文。

我也尝试过(userDao)

public int Update(UserApplication userApp)
            {                
                using (Context dpEnt = new Context())
                {
                    try
                    {
                        dpEnt.UserApplications.AddObject(userApp);
                        return dpEnt.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        _log.Error(ex.Message);
                        return -1;
                    }
                }
            }

在这里,它也不起作用

你能帮我吗?

1 个答案:

答案 0 :(得分:0)

在将用户附加到上下文后,您必须将应用程序添加到用户。否则EF将无法识别新应用程序:

在userDao中你需要一些方法,如:

public int AddApplicationToUser(User userToSave,
    int appId, int serverId, string bin)
{                
    using (Context dpEnt = new Context())
    {
        try
        {
            dpEnt.Attach(userToSave);
            userToSave.AddApplication(appId, serverId, bin);

            return dpEnt.SaveChanges();
        }
        catch (Exception ex)
        {
            _log.Error(ex.Message);
            return -1;
        }
    }
}

然后只打电话:

userDao.AddApplicationToUser(this.currentUser,
    _currentApp.Id, _currentServer.Id, "my_directory");

您还可以将新应用程序直接添加到上下文并保存更改,因为您的应用程序具有为用户设置的正确外键属性。