dbset.local update database:不能将重复值插入到唯一索引中
本文关键字:插入 唯一 索引 update local database 不能 dbset | 更新日期: 2023-09-27 18:32:28
在我的EF 4.3.1上调用entities.savechanges((时出现错误。我的数据库是一个 sql ce v4 存储,我正在以 mvvm 模式编码。我有一个本地版本的上下文,我将其发送到可观察的集合并修改等。这工作正常,当我在数据库中不存在行时调用 savechanges(( 时,对象会很好地保持。当我重新加载应用程序时,对象将按预期填充在我的列表框中,但是如果我添加另一个对象并调用 savechanges((,我会收到一条错误消息,指出无法将重复值插入到唯一索引中。
据我了解,这意味着上下文正在尝试将我的实体保存到数据存储中,但它似乎正在添加我未触及的原始对象以及新对象。我以为这会让他们一个人呆着,因为他们的状态没有改变。
private void Load()
{
entities.Properties.Include("Images").Load();
PropertyList = new ObservableCollection<Property>();
PropertyList = entities.Properties.Local;
//Sort the list (based on previous session stored in database)
var sortList = PropertyList.OrderBy(x => x.Sort).ToList();
PropertyList.Clear();
sortList.ForEach(PropertyList.Add);
propertyView = CollectionViewSource.GetDefaultView(PropertyList);
if (propertyView != null) propertyView.CurrentChanged += new System.EventHandler(propertyView_CurrentChanged);
private void NewProperty()
{
try
{
if (PropertyList != null)
{
Property p = new Property()
{
ID = Guid.NewGuid(),
AgentName = "Firstname Lastname",
Address = "00 Blank Street",
AuctioneerName = "Firstname Lastname",
SaleTitle = "Insert a sales title",
Price = 0,
NextBid = 0,
CurrentImage = null,
Status = "Auction Pending",
QuadVis = false,
StatVis = false, //Pause button visibility
Sort = PropertyList.Count + 1,
};
PropertyList.Add(p);
SaveProperties();
}
private void SaveProperties()
{
try
{
foreach (var image in entities.Images.Local.ToList())
{
if (image.Property == null)
entities.Images.Remove(image);
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
entities.SaveChanges();
}
没有注释这里的所有代码,这是导致您提出的特定问题的位:
//Sort the list (based on previous session stored in database)
var sortList = PropertyList.OrderBy(x => x.Sort).ToList();
PropertyList.Clear();
sortList.ForEach(PropertyList.Add);
此代码:
- 从已查询并由上下文作为未更改实体进行跟踪的实体开始。也就是说,已知已存在于数据库中的实体。
- 创建这些实体的新排序列表。
- 在本地集合上调用 Clear 会导致每个跟踪的实体标记为已删除并从集合中删除。
- 将每个实体添加回上下文,使其现在处于"已添加"状态,这意味着它是新的,将在调用 SaveChanges 时保存到数据库中,
因此,您有效地告诉 EF,数据库中存在的所有实体实际上都不存在,需要保存。因此,它尝试执行此操作,并导致您看到的异常。
若要解决此问题,请不要清除 DbContext 本地集合并重新添加实体。相反,您应该使用本地集合在视图中排序,以支持视图。
听起来您正在将现有实体添加到上下文中(将它们标记为要插入(,而不是附加它们(将它们标记为现有的、未修改的(。
我也不确定新的 Guid(( 是否返回相同的 guid...我总是使用 Guid.NewGuid(( http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx