EntityFramework Core 2.0.1 - 使用SQLite进行级联删除

时间:2017-12-03 19:46:45

标签: c# sqlite entity-framework-core .net-standard-2.0

我知道这个问题已被提出并回答了几次:

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上成功使用过父/子更新?我的另一种方法是在保存之前手动检查每个子对象的状态,但对于以前工作的功能来说这似乎是不必要的。提前谢谢你看这个。 enter image description here

这是我的联系方式和客户类

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

    }

0 个答案:

没有答案