3

这是我的模型及其相关枚举,下面是我与实体框架 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
    }

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

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

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

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

创建帖子方法

[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");
            }

编辑帖子方法

[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 上查看了许多答案,但没有一个可以帮助我,干杯,因此在提问之前等待两天。

4

1 回答 1

5

根据您的评论 - 由于您以 .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 将使所有这些功能可用。

于 2013-01-05T05:07:56.597 回答