我知道这个问题已被提出并回答了几次:
Specifying ON DELETE NO ACTION in Entity Framework 7?
Configuring cascade delete with EF7
但在我的情况下,我正在使用SQLite,但似乎没有任何解决方案可行。用于更新数据库的类似代码在SQL Server上的EF6中工作,但除非我遗漏了一些非常明显的东西,否则在.NET Standard 2.0上使用SQLite的EF Core上不起作用。我有一个带有子联系人的父客户,我现在一直保存它们。
using (var dbc = new ContactsDbContext())
{
var customer = dbc.Customers.First(s => s.CustomerID == ReadProperty(CustomerIDProperty).ToString());
foreach (var item in dbc.Contacts.Where(x => x.CustomerID == ReadProperty(CustomerIDProperty).ToString()))
{
dbc.Contacts.Remove(item);
}
MapToEntity(customer);
dbc.SaveChanges();
}
我在SaveChanges()
上得到以下异常发生了System.InvalidOperationException 的HResult = 0x80131509 消息=无法跟踪实体类型“联系人”的实例,因为已经跟踪了另一个键值为“ContactID:99b44b3e-c981-4140-9198-b665d3d85600”的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
我喜欢能够在以前版本的EF中全局关闭级联删除。这是以前的工作:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
我尝试过使用以下两种解决方案,但这些解决方案都不适用于SQLite。
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
// Also tried Cascade, and all other options
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
和
modelBuilder.Entity<Entity.Contact>()
.HasOne(p => p.Customer)
.WithMany()
.HasForeignKey("CustomerID")
.OnDelete(DeleteBehavior.Restrict);
有没有人在SQLite上成功使用过父/子更新?我的另一种方法是在保存之前手动检查每个子对象的状态,但对于以前工作的功能来说这似乎是不必要的。提前谢谢你看这个。
这是我的联系方式和客户类
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Contacts.Library.Data.Entity
{
[Serializable()]
public class Contact
{
[Key]
public int PrimaryKey { get; set; }
[Required, MaxLength(36)]
public string ContactID { get; set; }
[ForeignKey("CustomerID"), MaxLength(36)]
public string CustomerID { get; set; }
[MaxLength(50)]
public string Name { get; set; }
// Path back to related customer
public virtual Customer Customer { get; set; }
}
}
[Serializable()]
public class Customer
{
[Key]
public int PrimaryKey { get; set; }
[Required, MaxLength(36)]
public string CustomerID { get; set; }
[Required, MaxLength(50)]
public string Name { get; set; }
// A customer has a collection of contacts
public virtual ICollection<Contact> Contacts { get; set; }
}
这是我的索引
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Name on customer is unique
modelBuilder.Entity<Entity.Customer>().HasIndex(c => c.Name).IsUnique();
// Add index
modelBuilder.Entity<Entity.Customer>().HasIndex(
customer => new { customer.CustomerID }).IsUnique(false);
// Add index
modelBuilder.Entity<Entity.Contact>().HasIndex(
contact => new { contact.ContactID }).IsUnique(false);
// Add index
modelBuilder.Entity<Entity.Contact>().HasIndex(
contact => new { contact.CustomerID }).IsUnique(false);
}