落入EF的逻辑错误

时间:2014-02-19 19:42:48

标签: c# entity-framework asp.net-mvc-4 rss logic

这对我来说可能有点复杂。这取决于上下文,但这就是我所拥有的。

这一切都从控制器开始,我有一个添加feed的操作,这个操作在存储库中调用,而存储库中的方法是谁真正将数据库保存在数据库中。

控制器。

public ActionResult Create(Feed feed)
    {
        if (ModelState.IsValid)
        {
            feed.UserModelID = UserManager.GetInstance.Search(User.Identity.Name).UserModelID;
            if (FeedManager.GetInstance.Add(feed))
            {
                ViewBag.success = "success";
            }
            else
            {
                ViewBag.success = "error";
            }
        }
        return View(feed);
    }

feed有一个外键,在这种情况下是用户id(UserModelID),我在调用存储库中的方法之前分配。

存储库

public Boolean Add(Feed f)
    {
        if (GetLastestFeeds(f) != null)
        {
            f.Articles = GetLastestFeeds(f);
            Feeds.Add(f);
            Db.Feeds.Add(f);
            Db.SaveChanges();
            return true;
        }
        return false;
    }

Feed模式。

public class Feed
{
    public Int32 FeedID { get; set; }

    [Required(ErrorMessage = "The name is required")]
    [StringLength(32, MinimumLength = 8, ErrorMessage = "The name must be at least 8 characters")]
    public String Name { get; set; }

    [Required(ErrorMessage = "The url is required")]
    [Url(ErrorMessage = "Invalid URL")]
    public String Url { get; set; }

    [Required(ErrorMessage = "A type must be selected")]
    public Boolean IsAtom { get; set; }

    public Byte[] Image { get; set; }
    public String ImageIcon { get; set; }
    public Int32 UserModelID { get; set; }

    public virtual ICollection<Article> Articles { get; set; }
}

这里的问题是,当我刷新时,由于某种原因,用户没有添加新Feed的引用。我在代码的某些部分设置了一个断点,搜索用户实体,其feeds属性仍然为null。我尝试更改逻辑,添加用户的提要,所以我替换了这个...

Db.Feeds.Add(f);

为此...

Db.Users.Where(u => u.UserModelID == feed.UserModelID).first().feeds.Add(feed);

它不起作用。

1 个答案:

答案 0 :(得分:0)

我仍然需要猜测一些事情,但显然你有单件管理器对象,每个对象都有自己的上下文实例。不建议这样做。在Web应用程序中,通常每个请求都应该有一个上下文,没有长期的上下文。

您将Feed添加到FeedManager实例,但我认为您会显示UserManager实例中的用户。我还认为行Db.Users.Where(u => u.UserModelID == feed.UserModelID).first().feeds.Add(feed);FeedManager实例中执行。最重要的是,这些实例彼此之间一无所知,因此如果您向其中一个添加提要,则除非您主动重新加载用户,否则它们不会添加到另一个实例中的用户。但你似乎没有这样做。

无论我的猜测是否接近,如果您按照请求使用上下文,这都可以解决。也许你可以通过每个请求使用新的Manager个对象来实现这一点,如果这意味着每个新的管理器对象也有一个新的上下文实例。