我的数据库中有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]'。”}
请帮我解决这个问题。
答案 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();