繁体   English   中英

为什么Entity Framework没有正确保存模型上的枚举属性?

[英]Why is Entity Framework not saving enum properties on my model properly?

这是我的模型及其相关的枚举,我在下面使用实体框架5和asp.net mvc4 codefirst。 我也在使用便携式数据库文件(.mdf)

public class Project
    {
        public Project()
        {
            Images = new List<ProjectImage>();
        }

        public int ProjectId { get; set; }
        [Required]
        public string Title { get; set; }
        public virtual ICollection<ProjectImage> Images { get; set; }
        public string Description { get; set; }
        public ProjectType Type { get; set; }
        public ProjectState State { get; set; }
    }

    public enum ProjectType
    {
        Phone,
        Web,
        Windows
    }

    public enum ProjectState : byte
    {
        InProgress,
        NotStarted,
        Done
    }

从视图中回发模型后,除枚举字段外,所有字段都会正确保存到数据库中。 它们会被保存,但即使在视图中选择了不同的值,也只会保存每个枚举类型的第一个值。

我也试过保存编辑,同样的事情也发生了。

我已经逐步完成了我的创建post方法的开头,在我的上下文中调用savechanges之后似乎一切正常,但是当我重定向回到索引页面时,它将枚举属性值显示为枚举上的初始值(即第一个枚举值) )

我的创建和编辑方法如下。 希望它不是一个错误,但请帮助,因为我已经拉了我的头发这几天。 我刚刚开始使用codefirst和enums。 谢谢。

创建post方法

[HttpPost]
        public ActionResult Create(Project project, HttpPostedFileBase file)
        {
            try
            {
                if (file != null && file.ContentLength > 0 && file.ContentType.Contains("image"))
                {
                    //create a new unique filename with using guid, filename and project title
                    string relativePath = Constants.PortfolioImagesBaseFolder + 
                                        project.Title.Replace(" ", "") + 
                                        Guid.NewGuid().ToString() +
                                        Path.GetFileName(file.FileName);

                    string absolutePath = Server.MapPath(relativePath);

                    //save the file
                    file.SaveAs(absolutePath);

                    if (ModelState.IsValid)
                    {
                        project.Images.Add(new ProjectImage()
                        {
                            IsProjectMainImage = true,
                            Url = relativePath,
                            Title = "Main Project Image"
                        });
                        context.Projects.Add(project);
                        context.SaveChanges();

                        return RedirectToAction("Index");
                    }
                }

                ViewBag.ProjectTypes = CreateSelectListFromEnumType<ProjectType>();

                ViewBag.ProjectStates = CreateSelectListFromEnumType<ProjectState>();

                return RedirectToAction("Index");
            }

编辑Post方法

[HttpPost]
        public ActionResult Edit(int id, Project project)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    //Project projectFromDb = context.Projects.Single(p => p.ProjectId == id);
                    //projectFromDb.State = project.State;
                    //projectFromDb.Type = project.Type;
                    //projectFromDb.Title = project.Title;
                    //projectFromDb.Description = project.Description;
                    EntityState entityState = context.Entry(project).State;
                    context.Entry(project).State = EntityState.Modified;
                    context.SaveChanges();
                    return RedirectToAction("Index");
                }

                ViewBag.ProjectTypes = CreateSelectListFromEnumType<ProjectType>();

                ViewBag.ProjectStates = CreateSelectListFromEnumType<ProjectState>();

                return View(project);
            }

在标记为重复之前,我已经查看了stackoverflow上的许多答案,没有人可以帮助我,欢呼,因此等待两天才提出问题。

根据您的意见 - 由于您针对.NET Framework 4,因为作为.NET Framework 4一部分的EF 4不支持枚举,并且应用程序无法在仅具有此功能的计算机上运行,​​因此未发现枚举属性并将其添加到模型中安装了.NET Framework 4(而不是.NET Framework 4.5,即就地更新)。 出于同样的原因,在面向.NET Framework 4的项目中安装的EF5不允许在定位.NET Framework 4.5时使用EF5中可用的功能(枚举,地理空间类型,TVF等)。 将项目重定向到.NET Framework 4.5并重新安装EF5将使所有这些功能可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM