Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EF中陷入逻辑错误_C#_Entity Framework_Asp.net Mvc 4_Rss_Logic - Fatal编程技术网

C# 在EF中陷入逻辑错误

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); 它不起作用。我仍然

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

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

控制器

提要有一个外键,在本例中是用户id UserModelID,我在调用存储库中的方法之前分配了这个外键

存储库

饲料模型

为了这个

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);