不能在ASP.Net MVC 3项目与实体框架的SaveChanges(Can't Save

2019-07-31 02:36发布

学习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()

它不抛出任何异常,它的推移和重定向我的产品清单。

编辑的项目保持不变。

底层数据库(通过连接connectionstringsweb.config )保持不变,以及。

Answer 1:

你需要附上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();
}


Answer 2:

你应该AttachProduct实例前上下文SaveChanges

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();
}


Answer 3:

事实上,你应该重视。

假设你调用Edit(1)。 你的控制器会从你的数据库加载具有ID = 1的产品,并产生基于它的属性(您已在视图中声明反正那些)的HTML视图。 只要你离开编辑(INT的productId)方法,你看到你的观点出现在您的浏览器,你的DbContext已失去与该ID的产品; 它已经超出了范围。 然后,如果您更改您的产品,并提交表单,ASP MVC将凑齐基于表单字段创建新的产品对象(除其他事项外)和对象传递给编辑(产品产品)的方法。 由于这是一个全新的产品对象和旧的产品对象走出的范围,无论如何,你的DbContext不知道新产品如何与你的数据库:它是一个新的对象,是其现有的对象,如果它存在做它有什么变化? 如果将Product对象并设置其状态修改,则可以的DbContext开始检查其性质已经改变。



文章来源: Can't SaveChanges with Entity Framework in ASP.Net MVC 3 project