尝试使用实体框架MVC将数据插入数据库时​​出现InvalidOperationException

时间:2015-02-10 07:02:33

标签: c# asp.net-mvc entity-framework

我的数据库中有2个表, 1.员工,模型如下。

public class Employees
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int DepartmentId { get; set; }
    public string Designation { get; set; }
    public DateTime DateOfBirth { get; set; }
    [ForeignKey("Id")]
    public virtual IList<Address> Address { get; set; }
}

我有另一个名为Address的表。模型如下。

public class Address
{

    public int Id { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string PinCode { get; set; }
}

员工可以拥有多个地址。我正在动态添加用于添加地址的控件。我正在使用Entityframe工作来完成所有操作,如创建数据库,更新等。

我用于将数据添加到数据库的代码如下。

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(string command,[Bind(Include = "Id,FirstName,LastName,DepartmentId,Designation,DateOfBirth")] Employees employees, [Bind(Include = "Id,AddressLine1,AddressLine2,City,State,PinCode")] List<Address> address)
    {
            if (ModelState.IsValid)
            {
                foreach (var item in address)
                {
                    db.Address.Add(item);
                }
                db.Employees.Add(employees);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(employees);
    }

当我插入数据时,数据将被插入数据库中,但我得到以下异常。

  

EntityFramework.SqlServer.dll中发生了'System.InvalidOperationException'类型的异常,但未在用户代码中处理

     

其他信息:已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:无法在实体类型GridSample.Models.Employees上设置字段/属性地址。有关详细信息,请参阅InnerException。

The Innerexception:

  

{“无法将类型为'GridSample.Models.Address'的对象强制转换为'System.Collections.Generic.IList`1 [GridSample.Models.Address]'。”}

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

我认为你不能在一对多关系中对“one”类中的属性使用ForeignKeyAttribute。它应该在“many”类的属性上使用,以指定“one”类实例的键。因此,在您的情况下,您应该修改您的实体类以反映这种关系。

public class Employees
{
    //...

    [InverseProperty("Employee")]
    public virtual ICollection<Address> Addresses { get; set; }
}

public class Address
{
    //...

    public int EmployeeId { get; set; }

    [ForeignKey("EmployeeId"), InverseProperty("Addresses")]
    public virtual Employees Employee { get; set; }
}

这里ForeignKeyAttribute用于装饰导航属性并指定键属性。否则,您可以修饰键属性并指定导航属性,如下所示:

public class Address
{
    //...

    [ForeignKey("Employee")]
    public int EmployeeId { get; set; }

    [InverseProperty("Addresses")]
    public virtual Employee Employee { get; set; }
}

修改

您没有获得任何地址的原因是您将员工和地址单独添加到数据库,即没有指明它们之间的关系。有几种方法可以做到这一点,我认为最简单的方法是使用导航属性:

我可以:将地址添加到员工的地址集合中,而不是直接添加到dbset:

foreach (var item in address)
{
    employees.Addresses.Add(item);
}
db.Employees.Add(employees);
db.SaveChanges();

或II:对于每个地址,指定它所属的员工:

foreach (var item in address)
{
    item.Employee = employees;
    db.Address.Add(item);
}
db.Employees.Add(employees);
db.SaveChanges();