2012-01-25 188 views
1

我的DAL基于Entity Framework Code First。没有数据保存在数据库中,也没有错误被触发

我有一个后期模型和标签模型。一个职位可以有几个职位附加。

这是帖子:

public class Post 
{ 
    [Key] 
    public int PostID { get; set; } 
    ... 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

这是我的标签:

public class Tag 
{ 
    [Key] 
    public int TagID { get; set; } 

    [Required, StringLength(50)] 
    public string Name { get; set; } 

    public virtual ICollection<Post> Posts { get; set; } 
} 

当我救我的帖子,我没有任何错误,但没有被保存在数据库中。

enter image description here

正如你可以在上面的TagID的截图看到的是0,我不知道是什么原因???

enter image description here

任何想法?建议?

我的表格在Sql Server中正确创建。

谢谢。

PS:我的代码一定是好的,因为我从其他位置(它的工作原理)复制/粘贴它。


UPDATE

这里是更新标签实体(根据具体的职位)

Tag t = m_TagRepository.GetTag(tag.Trim().ToUpper()); 
    if (t == null) t = new Tag { Name = tag.Trim().ToUpper() }; 
    post.Tags.Add(t); 

下面是代码保存到一个职位的变化(以下标签)

代码
public void SavePost(Post post) 
    { 
     if (post.PostID == 0) 
     { 
      m_Context.Posts.Add(post); 
     } 
     else 
     { 
      var entry = m_Context.Entry(post); 
      entry.State = EntityState.Modified; 
     }    
     m_Context.SaveChanges(); 
    } 

我从编辑视图页获取回复:

[Authorize, HttpPost, ValidateInput(false), Theme("Admin")] 
    public ActionResult Edit(PostFullViewModel postToEdit) 
    { 
     if (!ModelState.IsValid) 
      return View(); 

     Post post = Mapper.Map<PostFullViewModel, Post>(postToEdit); 
     m_PostBusiness.UpdateTags(post, postToEdit.TagString); 
     m_PostBusiness.SavePost(post); 
     TempData.SetStatusMessage(Strings.Post_SavedSuccessfully); 

     return RedirectToAction("Manage"); 
    } 
+1

向我们展示创建实体并将其添加到上下文的代码。 –

+0

我更新了我的问题以显示代码。谢谢。 – Bronzato

+0

你仍然没有展示你是如何获得这个职位的? –

回答

1

这是常见的问题问了很多次。您从HTTP请求中获得了发布视图模型并将其映射到您的发布实体,但实体是在EF上下文之外创建的。你比为这个独立帖子增加了一些标签,附加了帖子并将帖子的状态改为修改。

现在问题在哪里?问题出在EF状态模型中。每个实体和每个independent association都有自己的状态。将帖子更改为已修改仅对EF表示帖子已更新,但标签与帖子之间的标签和关系保持不变。因为这个EF将只保存发布。

用于特定情况下的简单的解决方案是这样做的:

var post = GetPostFromYourRequest(); 
context.Posts.Attach(post); 
ProcessTags(post, postToEdit); 
context.SaveChanges(); 

整个复杂的逻辑是在过程变量。这取决于你想要做什么。如果你只想创建新的标签,你将会做你现在所做的事情(你必须从数据库中加载现有的标签,使用与附加信息相同的上下文)。

如果你想做任何复杂的操作,你应该加载原始帖子和数据库中的所有标签,并将你的传入视图模型合并到原始状态。例如,删除现有帖子和标签之间的关系是非常困难的,除非再次加载数据库的当前状态。该问题的详细说明是here

+0

非常感谢,它的工作原理。你的解释非常有帮助。 – Bronzato

0
  1. 弄清楚为什么标签识别为0 - 当标签识别为0,你没有设置状态修改,从而没有被保存。
  2. 火起来的SQL事件探查器,看看发生了什么SQL一边(可能没什么,因为1)
  3. 经过汤姆的出色EF/MVC tutorial
相关问题