2015-02-10 52 views
0

我的數據庫中有兩個表, 1.員工,模型如下。InvalidOprerationException嘗試使用entityframework MVC插入數據到數據庫MVC

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; } 
} 

員工可以有多個地址。我正在動態添加控件以添加地址。我正在使用實體框架工作的所有操作,如創建數據庫,更新等。

我用於將數據添加到數據庫的代碼如下。

[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); 
    } 

當我插入數據時,數據被插入到數據庫中,但我得到以下異常。

「System.InvalidOperationException」類型的異常出現在EntityFramework.SqlServer.dll但在用戶代碼中沒有處理

其他信息:對數據庫的更改被成功提交,但出現錯誤而更新對象上下文。 ObjectContext可能處於不一致的狀態。內部異常消息:無法在實體類型GridSample.Models.Employees上設置字段/屬性地址。詳情請參閱InnerException。

設置InnerException:

{「無法轉換類型 'GridSample.Models.Address' 的目的爲類型 'System.Collections.Generic.IList`1 [GridSample.Models.Address]' 「}

請幫我解決這個問題。

回答

0

我認爲你不能使用ForeignKeyAttribute對一對多關係中的「one」類的屬性。它應該用於「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(); 
+0

這沒有奏效。我現在沒有在地址中獲得價值。 – 2015-02-10 09:31:19

+0

對我來說地址是空的。 – 2015-02-10 10:42:38

相關問題