c# - Entity Framework

标签 c# asp.net asp.net-mvc entity-framework

我在做 MVC 3 Web 应用程序时遇到了奇怪的问题。这是一些代码:

模型声明:

public class Project
{
    public int ID { get; set; }

    [Required(ErrorMessage = "Write a title.")]
    public string Title { get; set; }

    public DateTime TimeAdded { get; set; }

    [Required(ErrorMessage = "Write some description.")]
    [MaxLength(int.MaxValue)]
    public string Content { get; set; }

    public ICollection<Comment> Comments { get; set; }
}   

public class Comment
{
    public int ID { get; set; }

    [Required()]
    public int ProjectID { get; set; }

    public DateTime TimeAdded { get; set; }

    [Required()]
    public string Text { get; set; }

    public Project project { get; set; }
}

Controller :

public class HomeController : Controller
{
    dataDBContext db = new dataDBContext();

    //
    // GET: /Home

    public ActionResult Index()
    {
        var comments = from c in db.Comments
                       select c;

        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;

        return View(projects.ToList());
    }
  1. 当我运行项目时,评论在我的 View 中不可见。
  2. 我在两个 linq 查询、调试和检查“项目”变量字段评论之后设置了一个断点,它们没有被填充。然后我检查“评论”变量,它有一些数据。再次检查“project”变量和 SOMEHOW 字段 Comments 被填充,最后 Comments 出现在网站上。如果我不设置断点并检查是否填充了变量“评论”,它们将不会出现在网站上。 (我希望这是可以理解的)
  3. 我找到了简单的解决方法:

    public ActionResult Index()
    {
        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;
    
        foreach (var p in projects)
        {
            var comments = from c in db.Comments
                           where c.ProjectID == p.ID
                           select c;
    
    
            p.Comments = comments.ToList();
        }
    
        return View(projects.ToList());
    }
    

    但看起来(根据第 2 点)这可以通过某种方式自动填充:)

有什么办法吗?


根据给定的答案进行另一次尝试:

public class HomeController : Controller
{
    dataDBContext db;

    public HomeController()
    {
        db = new dataDBContext();
        db.Configuration.LazyLoadingEnabled = false;
    }

    //
    // GET: /Home

    public ActionResult Index()
    {
        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;

        return View(projects.ToList());
    }

我有外键。我添加了 LazyLoadingEnabled。有 project.ToList() 但它不起作用。

根据第二个答案,我做了类似的事情:

public class HomeController : Controller
{
    dataDBContext db;

    public HomeController()
    {
        db = new dataDBContext();
    }

    //
    // GET: /Home

    public ActionResult Index()
    {
        var projects = from p in db.Projects
                       orderby p.TimeAdded descending
                       select p;

        var comments = from c in db.Comments
                       select c;

        List<Comment> l = comments.ToList();

        return View(projects.ToList());
    }

我只添加了 comments.ToList() 并且它正在运行。但我不确定这是否是正确的解决方案。可能比我的解决方法(第 3 点)更好。有什么建议吗?

谢谢

最佳答案

如果您在 Comments 和 Projects 之间有一个外键,您可以这样做

db.ContextOptions.LazyLoadingEnabled = false;
var projects = from p in db.Projects.Include("Comments")
                       orderby p.TimeAdded descending
                       select p;

当您执行 .ToList() 时,它将加载所有项目的所有评论。您将能够通过项目对象的导航属性“评论”访问数据。

关于c# - Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5212232/

相关文章:

c# - 使用 javascript 获取 Windows 用户名

sql-server - MVC4 : UserIsInRole - Unable to connect to SQL Server database

asp.net-mvc - 将 html 传递给函数 asp.net mvc

c# - 如何将结构中的预定义颜色转换为颜色列表?

c# - 谁有 C# 示例显示所有者绘制的具有热跟踪效果的 tabcontrol?

c# - 当你有 webforms 时如何向 asp.net 添加角色

asp.net - 自定义协议(protocol) MVC 重定向在 Chrome 但不适用于 IE

c# - 使用C#登录数据库验证

c# - Windows CE 4.2 的限制是什么?

asp.net - ASP.net 的虚拟 ListView ?