这对我来说可能有点复杂。这取决于上下文,但这就是我所拥有的。
这一切都从控制器开始,我有一个添加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);
它不起作用。
答案 0 :(得分:0)
我仍然需要猜测一些事情,但显然你有单件管理器对象,每个对象都有自己的上下文实例。不建议这样做。在Web应用程序中,通常每个请求都应该有一个上下文,没有长期的上下文。
您将Feed
添加到FeedManager
实例,但我认为您会显示UserManager
实例中的用户。我还认为行Db.Users.Where(u => u.UserModelID == feed.UserModelID).first().feeds.Add(feed);
在FeedManager
实例中执行。最重要的是,这些实例彼此之间一无所知,因此如果您向其中一个添加提要,则除非您主动重新加载用户,否则它们不会添加到另一个实例中的用户。但你似乎没有这样做。
无论我的猜测是否接近,如果您按照请求使用上下文,这都可以解决。也许你可以通过每个请求使用新的Manager
个对象来实现这一点,如果这意味着每个新的管理器对象也有一个新的上下文实例。