2015-12-14 46 views
0

我有一個與屬性虛擬參考稱爲blogpost型,將customer客戶類型。MVC EF郵政儲蓄型和一個

public virtual Customer Customer { get; set; } 

在我的形式我的blogpostcustomer數據發佈到一個控制器。所有值都被接收。然而,當我使用SaveChangescustomer數據不保存。

db.BlogPosts.Add(blog); 
db.SaveChanges(); 

所以我想blogpost數據保存到表blogpost(工作),但客戶表保持爲空。

public ActionResult WriteBlog(Models.BlogPost blog, HttpPostedFileBase blogImage, HttpPostedFileBase blogLogo) 
    { 

db.BlogPosts.Add(blog); 
db.SaveChanges(); 

return View(); 
} 
+0

你設置CustomerId/Customer屬性到博客? – Shyju

+0

你的意思是我首先要保存客戶,獲得新加入的ID和保存到博客帖子? – mausinc

+3

不,你不需要。你能顯示你的HttpPost動作方法的完整代碼嗎? – Shyju

回答

3

只要您在CustomerId/Customer屬性值設置爲BlogPost實體對象,它應該保存客戶沒有任何問題。所以我假設你的問題就出在你的剃鬚刀的看法,他沒有發出正確的數據回HttpPost操作方法。

它看起來像您正在使用直接在視圖通過實體框架生成的實體類。這通常不是一個好習慣,因爲現在你的觀點與這個實體緊密相連。理想情況下,您應該使用視圖特定的viewmodel類將視圖中的數據傳輸到action方法,然後您將讀取已發佈的viewmodel對象(由MVC Modelbinding從表單數據創建)屬性值,創建實體對象,設置屬性值並保存它。

首先,創建這樣

public class CreatePostViewModel 
{ 
    public int Id { set; get; } 
    [Required] 
    public string Title { set; get; } 
    [Required] 
    public string CustomerName { set; get; } 
    public HttpPostedFileBase BlogImage { set; get; } 
    public HttpPostedFileBase BlogLogo { set; get; } 
} 

一個視圖模型讓您razorview強類型這個視圖模型

@model CreatePostViewModel 
@using (Html.BeginForm("Create", "Post", FormMethod.Post, 
               new { enctype = "multipart/form-data" })) 

{ 
    <label>Post title</label> @Html.TextBoxFor(s=>s.Title) 
    <label>Customer </label> @Html.TextBoxFor(s => s.CustomerName) 
    <label>Blog Image</label> <input type="file" name="BlogImage" /> 
    <label>Blog Logo </label> <input type="file" name="BlogLogo" /> 

    <input type="submit"/> 
} 

而在你HttpPost操作方法

[HttpPost] 
public ActionResult Create(CreatePostViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
    // To get the files, access model.BlogImage & model.BlogLogo properties 
    using(var db=new YourDbContext()) 
    { 
     var customer = new Customer(); 
     customer.Name = model.CustomerName; 
     //Set other property values as well 

     var blog = new BlogPost(); 
     blog.Title = model.Title; 
     blog.Customer = customer; 
     //Set other property values as well 

     db.Blogs.Add(blog); 
     db.SaveChanges(); 
    } 
    } 
    return View(model); 
}