2015-09-15 47 views
0

爲了簡單和測試,我從一個新項目中完成這項工作,然後將其應用到我的實際項目中,一旦我理解了問題。來自Collection的數據從數據庫中缺失(ASP.NET MVC)

我做了一個模型,名爲,其中包含一個列表屬性,名爲ServiceNeeded。前端用戶可以根據需要編碼儘可能多的服務,因此動態創建ServiceNeeded的輸入字段。在POST方法中,那些字符串輸入按預期綁定。我將Person對象保存到數據庫中,並按預期工作。當我嘗試從數據庫中檢索人員對象時,除服務需求都存在。

這裏是我的代碼

模型(Person.cs):

public class Person 
{ 
    public Guid Id { get; set; } 
    public String Name { get; set; } 
    public List<String> ServiceNeeded { get; set; } 

    public Person() 
    { 
     this.ServiceNeeded = new List<String>(); 
    } 
} 

控制器(索引和[POST]創建方法):

public ActionResult Index() 
    { 
     var x = db.People.ToList(); 
     return View(db.People.ToList()); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,Name,ServiceNeeded")] Person person) 
    { 
     if (ModelState.IsValid) 
     { 
      person.Id = Guid.NewGuid(); 
      db.People.Add(person); 

      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(person); 
    } 

正如我所說的輸入字段對於ServicesNeeded是動態創建的,但可以正確綁定到模型。

下面是運行期間的一些截圖:

做一些輸入用戶後: enter image description here

的我加了一個變量Index返回查看在運行時檢查前: enter image description here

正如所看到的,相同是存在的,除了服務需要。我對ASP.NET MVC和一般的Web開發相當新穎。我在我的項目中處理其他集合,雖然是對象的集合。只有這個特殊情況我不明白。我的錯誤在哪裏?

回答

0

如果未啓用延遲加載,則需要告訴dbcontext加載引用。

首先改變ServiceNeeded的虛擬財產,當你使用Include

var x = db.People.Include("ServiceNeeded").ToList(); 
return View(x); 

上裝載相關實體https://msdn.microsoft.com/en-us/data/jj574232.aspx

+0

謝謝你的回覆先生。我按照您的建議進行了修改,但似乎沒有解決我的問題。當我添加「包含」時出現此錯誤: 附加信息:指定的包含路徑無效。 EntityType'WebApplication3.Models.Person'不聲明名爲'ServiceNeeded'的導航屬性。我也在嘗試加載中的不同方法,但目前爲止還沒有進展。 – JeanDeus

0

看第一條拉下人

public virtual List<String> ServiceNeeded { get; set; } 

然後加載屬性數據庫;那裏有記錄嗎?我認爲問題在於ServicesNeeded集合沒有保存到數據庫中;嘗試添加:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,Name,ServiceNeeded")] Person person) 
    { 
     if (ModelState.IsValid) 
     { 
      person.Id = Guid.NewGuid(); 
      db.People.Add(person); 

      foreach (var service in person.ServicesNeeded) 
       db.ServicesNeeded.Add(service); 

      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(person); 
    } 

我不相信附到Person對象上調用SaveChanges()自動持續的關係,也有可能不是能夠進入數據庫。

+0

謝謝你的答覆先生,但如果我瞭解你的方法,我必須爲服務字符串製作一個單獨的表格。儘可能我試圖避免這種情況。 – JeanDeus

+0

你必須將它們保存在某個地方,你在哪裏保存它們?或者問題是你沒有保存它們;您不需要另一個表,但將一個字符串列添加到Person對象,然後在保存到DB時,將由|或其他東西,然後在加載它們時將它們分開。不過,我建議你小心地向EF生成的實體添加自定義屬性,這些屬性不是由EF加載的屬性,因爲您可能會遇到錯誤,因爲您不能在使用EF拋出異常的LINQ和其他操作中使用這些屬性。 –

0

我認爲適合實體框架的工作最好的辦法是創建另一個Model你「ServiceNeeded」,把它添加到你的「的DbContext」,在相應的DbSet保存任何服務和LINQ使用.Include檢索。這個冗長的介紹後看看下面的代碼: 在你的模型:

public class MyService{ 
    public Guid Id {get;set;} 
    public string ServiceName {get;set;} 
    public Guid PersonId {get;set;} 
} 
public class Person 
{ 
    public Guid Id { get; set; } 
    public String Name { get; set; } 
    public virtual IList<MyService> ServiceNeeded { get; set; } 
} 

在你ApplicationDbContext:

public System.Data.Entity.DbSet<MyService> MyServices { get; set; } 
public System.Data.Entity.DbSet<Person> People { get; set; } 

在帖子中的ActionResult:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "Id,Name,ServiceNeeded")] Person person, List<String> ServiceNeeded) 
{ 
    if (ModelState.IsValid) 
    { 

     db.People.Add(person); 
     db.SaveChanges(); 
     db.Entry(person).GetDatabaseValues(); 
     foreach (string service in ServiceNeeded){ 
      db.MyServices.Add(new MyService {ServiceName = service, 
        PersonId = person.Id}) 
     } 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(person); 
} 

請注意我刪除了person.Id = Guid.NewGuid();,以便Id 生成,數據庫標識爲,然後我重新獲取person.Id,以便創建MyService記錄。

,最後爲@ JamieD77建議,在您的GET的ActionResult:

public ActionResult Index() 
{ 
    var x = db.People.Include("ServiceNeeded").ToList(); 
    return View(x); 
}