已成功提交对数据库的更改... ObjectContext可能处于不一致状态

时间:2016-12-29 14:32:55

标签: c# entity-framework exception entity

  

已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:无法在实体类型Evalv.Services.employedetail上设置字段/属性登录

登录和员工的实体框架类

public partial class login
{
    public string password { get; set; }
    public string status { get; set; }
    public bool active { get; set; }
    public string emailId { get; set; }
    public int employeeId { get; set; }
}

public partial class employedetail
{
    public employedetail()
    {
        this.logins = new HashSet<login>();
    }

    public int employeeId { get; set; }
    public string firstName { get; set; }
    public string middleName { get; set; }
    public string lastName { get; set; }       
    public string emailId { get; set; }               

    public virtual ICollection<login> logins { get; set; }
}

保存数据的方法

//employedetail e  and login l are entity objects with data passed to below method.

public string RegisterUser(employedetail e , login l)
            {
                try
                {
                    using (EvalvEntities context = new EvalvEntities())
                    {
                        context.employedetails.Add(e);
                        context.logins.Add(l);
                        if (context.SaveChanges() > 0)
                        {
                            return "Registered";
                        }
                        else
                        {
                            return "Not Registered";
                        }
                    }
                }
                catch(Exception ex)
                {
                    return "Error :" + ex;
                }

            }

注意:相同异常的其他一些帖子坚持认为这可能是因为缺少主键。但我有主键&amp; amp; employedetaillogin表的外键。所以不确定出了什么问题。每次我们将实体对象添加到上下文时,我应该调用context.SaveChanges()吗?

例如

context.employedetails.Add(e);
context.SaveChanges();
context.logins.Add(l);
context.SaveChanges();

还是有更好的方法吗? 非常感谢任何帮助。

UPDATE :在记录为context.savechanges()生成的查询时,我得到了以下查询&amp;例外

INSERT [dbo].[employedetails]([employeeId], [firstName], [middleName], [lastName], [emailId])
VALUES (@0, @1, NULL, @2, @3, )
-- @0: '4567' (Type = Int32)
-- @1: 'sam' (Type = String, Size = 255)
-- @2: 'anderson' (Type = String, Size = 255)
-- @3: 'sam@gmail.com' (Type = String, Size = 255)
-- Executing at 30-12-2016 12:17:27 AM +05:3
-- Completed in 1 ms with result: 1


INSERT [dbo].[login]([employeeId], [emailId], [password], [status], [active])
VALUES (@0, @1, @2, NULL, @3)
-- @0: '4567' (Type = Int32)
-- @1: 'sam@gmail.com' (Type = String, Size = 255)
-- @2: '123456' (Type = String, Size = 255)
-- @3: 'False' (Type = Boolean)
-- Executing at 30-12-2016 12:17:28 AM +05:30
-- Completed in 2 ms with result: 1

抛出异常:&#39; System.InvalidOperationException&#39;在EntityFramework.SqlServer.dll

更新2 :带有登录映射的图片 enter image description here

1 个答案:

答案 0 :(得分:0)

如果您使用一对多关系登录和EmployeeDetail类,那么您在登录类中缺少public virtual employedetail employeedetail {get; set;}

请在您的登录类中添加此行。(因此您遇到此问题。)

public partial class login
{
    public string password { get; set; }
    public string status { get; set; }
    public bool active { get; set; }
    public string emailId { get; set; }
    public int employeeId { get; set; }
    public virtual employedetail employeedetail {get; set;} //Add this in your class
}

注意: - 类名首字母应该在Capital中,并在您的班级姓名中更正employeedetail到EmployeeDetail的拼写。