在ASP.Net MVC 3项目中无法使用Entity Framework进行SaveChanges

hor*_*rgh 5 c# entity-framework savechanges ef-code-first asp.net-mvc-3

学习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; }
}
Run Code Online (Sandbox Code Playgroud)

和a DbContext:

public class EFDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和一个存储库:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它让我看到产品列表,打开编辑视图,根据属性集验证所有内容......

当我保存经过验证的更改时,它将转到Http Post Edit方法并进行必要的操作SaveChanges().

它没有抛出任何异常,它继续并将我重定向到产品列表.

编辑的项目保持不变.

底层数据库(通过connectionstringsin 连接web.config)也保持不变.

Era*_*nga 8

您需要附加在EF外部创建的实体实例,并让EF知道它已被修改.

public void SaveProduct(Product product)
{
    if (product.ProductID == 0)
    {
        context.Products.Add(product);
    }
    else
    {
        context.Products.Attach(product);
        context.Entry(product).State = EntityState.Modified;
    }

    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

  • @horgh正确的方法是使用ViewModels与视图交互并将它们来回映射到控制器中的模型实例. (2认同)