C# 在EF中陷入逻辑错误
这对我来说可能有点复杂。这取决于上下文,但这里是我所拥有的 这一切都从控制器开始,我有一个操作要添加提要,这在存储库中调用一个操作,存储库中的方法是谁真正将提要保存在数据库中 控制器 提要有一个外键,在本例中是用户id UserModelID,我在调用存储库中的方法之前分配了这个外键 存储库 饲料模型 为了这个C# 在EF中陷入逻辑错误,c#,entity-framework,asp.net-mvc-4,rss,logic,C#,Entity Framework,Asp.net Mvc 4,Rss,Logic,这对我来说可能有点复杂。这取决于上下文,但这里是我所拥有的 这一切都从控制器开始,我有一个操作要添加提要,这在存储库中调用一个操作,存储库中的方法是谁真正将提要保存在数据库中 控制器 提要有一个外键,在本例中是用户id UserModelID,我在调用存储库中的方法之前分配了这个外键 存储库 饲料模型 为了这个 Db.Users.Where(u => u.UserModelID == feed.UserModelID).first().feeds.Add(feed); 它不起作用。我仍然
Db.Users.Where(u => u.UserModelID == feed.UserModelID).first().feeds.Add(feed);
它不起作用。我仍然要猜测一些事情,但很明显,您有单例管理器对象,每个对象都有自己的上下文实例。不建议这样做。在web应用程序中,通常每个请求都应该有一个上下文,而不是长期存在的上下文 您将提要添加到FeedManager实例,但我认为您显示了UserManager实例中的用户。我还认为行Db.Users.Whereu=>u.UserModelID==feed.UserModelID.first.feed.Addfeed;在FeedManager实例中执行。底线是,这些实例彼此一无所知,因此如果您向其中一个实例添加提要,它们将不会添加到另一个实例中的用户,除非您主动重新加载该用户。但你好像没那么做
无论我的猜测是否接近,如果您使用每个请求的上下文,这一切都可以解决。如果这意味着每个新的管理器对象也有一个新的上下文实例,那么您可以通过在每个请求中使用新的管理器对象来实现这一点。如何刷新,这到底是什么意思?对页面的新GET请求。。。因为我没有使用ajax和部分更新,我必须刷新页面…页面-显示提要的页面?你怎么知道用户没有添加对新提要的引用?当我刷新显示提要的页面时,我调用一个操作,该操作在数据库中搜索用户,获取其提要,并显示它们,在该操作中,我在代码中放置了一个断点,并看到返回的用户没有提要。我有了解决方案,谢谢,这真的很有帮助,它会让我改进一些东西。你是对的,我正在从UserManager获取用户,但我忘记了将提要添加到位于该实例中的用户。不客气。但这将是一个短期解决方案。我认为您真的必须咬紧牙关,改进您的总体架构。我应该在singleton存储库的每个方法中调用一个新的db上下文实例,因为我不希望与控制器中的操作进行交互。我明白,是吗?这可能是第一个重大改进。但如果可能的话,我也会尝试消除这些单例。当然,我会寻找更好的解决方案。再次感谢。
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;
}
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; }
}
Db.Feeds.Add(f);
Db.Users.Where(u => u.UserModelID == feed.UserModelID).first().feeds.Add(feed);