[英]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.