无法更新备用密钥实体框架核心1.0

时间:2016-03-24 12:39:57

标签: c# asp.net sql-server asp.net-mvc entity-framework

我使用实体框架7或核心1.0作为我的新项目。在products表中, ProductName 列被设置为备用键(唯一约束)。问题是我无法在数据库中更新此列。编辑操作的代码如下:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(ProductViewModel product, int id, IFormFile ProductImage)
{
    try
    {
        if (ModelState.IsValid)
        {
            var Product = _products.Find(x => x.ProductID == id).Single();
            string tempName = Product.ProductName; //for deleting directory if name has been changed.
            Product = _mapper.Map<Product>(product);

            //code to replace image file if new file has been uploaded OR
            //delete / change directory if the product name has been changed
            //goes here

            //Insert id again after mapping 
            Product.ProductID = id;
            ProductImage image = _images.Find(m => m.ProductID == id).Single();
            image.Hash = FileName;
            image.Product = Product;
            image.Extension = FileExtension;
            image.ProductID = Product.ProductID;
            _products.Update(Product);
            _images.Update(image);
            if (_products.SaveAll() && _images.SaveAll())
            {
                return RedirectToAction("Index");
            }
        }

    }
    catch (Exception ex)
    {
        _logger.LogDebug(ex.Message);
        throw;
    }
    product.Categories = _categories.GetAll().ToList();
    return View(product);
}

我通过所有这些进行了调试,一切正常,所有其他属性都在数据库中更新, ProductName 正在内存对象(而不是数据库)中更新,正在更新文件/文件夹,甚至图像数据库表正在更新,但是当产品名称更改时, SaveAll() if语句中的return语句不是&# 39; t执行也不是数据库中的这个特定列正在更新。请帮忙!

2 个答案:

答案 0 :(得分:9)

好的,我通过Entity Framework Core的Github找到了答案。这是答案:

EF Core目前不支持更改备用密钥的值。我们确实#4073跟踪了这一限制。

顺便说一句,如果您希望将它用作关系的目标键,它只需要是备用键。如果您只想要一个唯一索引,那么使用HasIndex()方法,而不是AlternateKey()。可以更改唯一索引值。

来源: Github

答案 1 :(得分:1)

您不能更改设置为备用键的列。

如果只想在表中使用唯一索引,则可以将HasIndexIsUnique一起使用,例如:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>()
        .HasIndex(u => u.ProductName)
        .IsUnique();
}
  

索引是许多数据存储中的通用概念。虽然他们   数据存储中的实现可能有所不同,它们用于   基于一列(或一组列)的查找效率更高。通过   按照惯例,将在每个属性(或一组属性)中创建一个索引   属性)用作外键。

详细了解EF Core Indexes