【发布时间】:2013-01-04 23:04:31
【问题描述】:
这是我的模型,下面是它们的相关枚举 我与实体框架 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 上查看了很多答案,但没有一个可以帮助我,干杯,因此在提问之前等待两天。
【问题讨论】:
-
您检查过数据库中实际保存的内容吗?在我看来,枚举属性似乎没有在某处初始化,因此正在保存默认值。问题是它发生是因为您使用默认值保存,还是由于错误,您忽略了从数据库中读取的内容并分配了稍后保存的默认值。
-
我确实初始化了枚举值,正如我上面提到的,逐步执行代码显示它们与发布的表单值一起保存,但奇怪的是枚举属性在 codefirst 创建的数据库中没有对应的列.这是正常行为吗?
-
'奇怪的是枚举属性在数据库中没有对应的列'这是你的问题。您使用的是 .NET Framework 4 还是 .NET Framework 4.5?还是您的目标是 .NET Framework 4?
-
感谢@Pawel,看来我的目标是 .net4 而不是 4.5,它不允许我使用最新版本的实体框架。切换到 4.5 并将枚举列添加到数据库中的表中。
标签: c# asp.net-mvc entity-framework enums ef-code-first