【发布时间】:2012-08-16 13:06:31
【问题描述】:
学习 asp.net mvc 3 + EF 代码优先。我对两者都很陌生。我的例子是微不足道的,但我仍然无法让它工作。遗漏了一些简单而明显的东西......
我有课:
public class Product
{
[HiddenInput(DisplayValue = false)]
public int ProductID { get; set; }
[Required(ErrorMessage = "Please enter a product name")]
public string Name { get; set; }
[Required(ErrorMessage = "Please enter a description")]
[DataType(DataType.MultilineText)]
public string Description { get; set; }
[Required]
[Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")]
public decimal Price { get; set; }
[Required(ErrorMessage = "Please specify a category")]
public string Category { get; set; }
}
还有一个DbContext:
public class EFDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
还有一个存储库:
public class EFProductRepository : IProductRepository
{
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products
{
get
{
return context.Products;
}
}
public void SaveProduct(Product product)
{
if (product.ProductID == 0)
context.Products.Add(product);
context.SaveChanges();
}
}
mvc 控制器:
public class AdminController : Controller
{
private IProductRepository repository;
public AdminController(IProductRepository repo)
{
repository = repo;
}
public ViewResult Index()
{
return View(repository.Products);
}
public ViewResult Edit(int productId)
{
Product product = repository.Products.FirstOrDefault(p => p.ProductID == productId);
return View(product);
}
[HttpPost]
public ActionResult Edit(Product product)
{
if (ModelState.IsValid)
{
repository.SaveProduct(product);
TempData["message"] = string.Format("{0} has been saved", product.Name);
return RedirectToAction("Index");
}
else
{
// there is something wrong with the data values
return View(product);
}
}
}
它让我查看产品列表,打开编辑视图,根据属性集验证所有内容...
当我保存经过验证的更改时,它会转到 Http Post Edit 方法并生成必要的 SaveChanges()。
它不会抛出任何异常,它会继续并将我重定向到产品列表。
编辑的项目保持不变。
底层数据库(通过web.config 中的connectionstrings 连接)也保持不变。
【问题讨论】:
-
试图找出我是否使用了不同的上下文...如果在两种不同的
Edit方法中检查,我的AdminController中的repository似乎有不同的GetHashCode()... .不知道它是否会说smth -
我使用 Ninject(也在学习 DI)
-
ProductID的默认值不会是Int32.MinValue,而不是0吗?此外,您如何以及何时将存储库传递给 AdminController 构造函数?
-
即便如此,也并非如此,因为我只尝试编辑现有行
标签: c# asp.net-mvc-3 entity-framework ef-code-first savechanges