我使用实体框架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执行也不是数据库中的这个特定列正在更新。请帮忙!
答案 0 :(得分:9)
好的,我通过Entity Framework Core的Github找到了答案。这是答案:
EF Core目前不支持更改备用密钥的值。我们确实#4073跟踪了这一限制。
顺便说一句,如果您希望将它用作关系的目标键,它只需要是备用键。如果您只想要一个唯一索引,那么使用HasIndex()方法,而不是AlternateKey()。可以更改唯一索引值。
来源: Github
答案 1 :(得分:1)
您不能更改设置为备用键的列。
如果只想在表中使用唯一索引,则可以将HasIndex
与IsUnique
一起使用,例如:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasIndex(u => u.ProductName)
.IsUnique();
}
索引是许多数据存储中的通用概念。虽然他们 数据存储中的实现可能有所不同,它们用于 基于一列(或一组列)的查找效率更高。通过 按照惯例,将在每个属性(或一组属性)中创建一个索引 属性)用作外键。
详细了解EF Core Indexes