ASP.如何获得FilePath传入PeopleDB

本文关键字:传入 PeopleDB FilePath 何获得 ASP | 更新日期: 2023-09-27 18:11:57

我是一个ASP新手。. NET使用实体框架。我有不同的模型的人,FileType和FilePath。我想通过从FilPath中检索文件路径以及索引视图中的名称,年龄等数据来显示图像。我使它发生在详细视图,但在索引视图页面,我收到的错误为"值不能为空",这是由FilePath在PeopleDB是空引起的。
下面是我的代码,请帮忙。谢谢。

/模型/PeopleDB.cs

namespace MvcDemo.Models {
    public class PeopleDB
    {
        public PeopleDB()
        {
         this.FilePaths = new HashSet<FilePath>();
        }
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
        public string Interests { get; set; }
        public ICollection<FilePath> FilePaths { get; set; }
    }

    public class PeopleDBContext : DbContext
    {
        public DbSet<FilePath> FilePaths { get; set; }
        public DbSet<PeopleDB> People { get; set; }      
    }
     }

/模型/FilePath.cs

 namespace Assessment_HC.Models
{        
    public class FilePath
    {
        public int FilePathId {get;set;}
        [StringLength(255)]
        public string FileName {get;set;}
        public FileType FileType {get;set;}
        public int PersonID {get;set;}
        public virtual PeopleDB Person {get;set;}
    }    
}

Moedel/FileType.cs

    namespace Assessment_HC.Models
{
    public enum FileType
    {
        Avatar = 1, Photo
    }
}

这是索引视图

的控制器
//Get: /People/Index
public ActionResult Index()
{
    return View(db.People.ToList());
}

In db.People.ToList(), People. list()。FilePath视图为空

在控制器中,detail视图是这样的,从这里我可以得到detail页面上显示的图像:

// GET: /People/Details
public ActionResult Details(int id = 0)
{
    PeopleDB peopledb = db.People.Find(id);
    PeopleDB people = db.People.Include(i => i.FilePaths).SingleOrDefault(i => i.ID == id);
    if (peopledb == null)
    {
        return HttpNotFound();
    }
    return View(peopledb);
}

谢谢你的帮助。如果你需要更多代码,请告诉我。

ASP.如何获得FilePath传入PeopleDB

根据评论,似乎你唯一应该做的就是将PeopleDBFilePaths属性更改为virtual以使用延迟加载(默认启用):

public virtual ICollection<FilePath> FilePaths { get; set; }

延迟加载是默认启用的,正如评论中所述,您没有更改它,并且在您的上下文构造函数中没有关于延迟加载的任何内容,因此似乎问题在于您的FilePaths导航属性不是虚拟的。

对于索引操作:

return View(db.People.ToList());

要了解详细操作,最好这样做:

var people = db.People.Where(x => x.ID == id).FirstOrDefault();
if (people == null)
{
    return HttpNotFound();
}
return View(people );    

但无论如何,如果禁用延迟加载,你应该使用Include在结果中包含你的导航属性。在这种情况下,您可以在索引操作中加载数据:

db.People.Include(x => x.FilePaths).ToList()

//Remember to add using System.Data.Entity;
db.People.Include("FilePaths").ToList() 

和禁用延迟加载,你可以

db.Configuration.LazyLoadingEnabled = true;

或者在上下文的构造函数中:

this.Configuration.LazyLoadingEnabled = false;

更多信息:

加载相关实体

延迟加载是指一个实体或集合第一次从数据库中自动加载实体访问一个引用实体/多个实体的属性。当使用的实例来实现延迟加载派生代理类型,然后重写虚拟属性以添加加载钩。

我已经测试了代码,唯一需要做的就是使用Include方法启用Eager loading:

    public ActionResult Index()
    {
        var _db = new ApplicationDbContext();
        var model = _db.People.Include("FilePaths").ToList();
        return View(model);
    }

在这种情况下,将加载所有相关的文件路径。

您也可以将filepath设置为虚拟的:

public virtual ICollection<FilePath> FilePaths { get; set; }

然后这样修改你的查询:

var model = _db.People.ToList();

在这两种情况下,将加载所有相关的文件路径