繁体   English   中英

为什么实体框架试图在删除时删除关联的行?

[英]Why is entity framework trying to delete the associated row on delete?

所以我有这个代码:

...
     modelBuilder.Entity<Person>(builder => {
           builder.ToTable("person");
           builder.Property(x => x.PersonId).HasColumnName("nconst");
           builder.Property(x => x.FirstName).HasColumnName("firstname");
           builder.Property(x => x.LastName).HasColumnName("lastname");
           builder.Property(x => x.BirthYear).HasColumnName("birthyear");
           builder.HasKey(x => x.PersonId);
           builder.HasMany(x => x.Works).WithOne().HasForeignKey(x => x.PersonId);
           builder.HasOne(x => x.Death).WithOne().HasForeignKey<Death>(x => x.PersonId);
     });

     modelBuilder.Entity<PersonBookmark>(builder => {
          builder.ToTable("personbookmark");
          builder.Property(x => x.PersonId).HasColumnName("nconst");
          builder.Property(x => x.UserId).HasColumnName("user_id");
          builder.Property(x => x.Date).HasColumnName("date");
          builder.Property(x => x.Label).HasColumnName("label");
          builder.HasKey(x => new { x.UserId, x.PersonId });
          builder.HasOne(x => x.User).WithMany(x => x.PersonBookmarks).HasForeignKey(x => x.UserId);
          builder.HasOne(x => x.Person).WithOne().HasPrincipalKey<PersonBookmark>(x => x.PersonId).HasForeignKey<Person>(x => x.PersonId);
     });
...
namespace DataService.Domain {

    public class PersonBookmark {

        public int UserId { get; set; }

        public DateTime Date { get; set; }

        [StringLength(100, MinimumLength = 1)]
        public string Label { get; set; }

        [StringLength(10, MinimumLength = 10)]
        public string PersonId { get; set; }


        [NotMapped]
        public virtual User User { get; set; }

        [NotMapped]
        public virtual Person Person { get; set; }
    }
}
namespace DataService.Domain {

    public class Person {

        public Person() {
            Works = new HashSet<Work>();
        }

        [StringLength(10, MinimumLength = 10)]
        public string PersonId { get; set; }

        [StringLength(100, MinimumLength = 1)]
        public string LastName { get; set; }

        [StringLength(100, MinimumLength = 1)]
        public string FirstName { get; set; }

        [StringLength(4, MinimumLength = 4)]
        public string BirthYear { get; set; }


        [NotMapped]
        public virtual ICollection<Work> Works { get; set; }

        [NotMapped]
        public virtual Death Death { get; set; }
    }
}
public bool DeletePersonBookmark(int UserId, string PersonId) {
    var personBookmark = Context.PersonBookmarks.FirstOrDefault(x => x.UserId == UserId && x.PersonId == PersonId);
     var found = personBookmark != null;

     if (found) {
          Context.PersonBookmarks.Remove(personBookmark);
          Context.SaveChanges();
     }

     return found;
}

当我尝试从数据库中删除PersonBookmark ,出现了以下异常:

Microsoft.EntityFrameworkCore.DbUpdateException : An error occurred while updating the entries. See the inner exception for details.
---- Npgsql.PostgresException : 23503: update or delete on table "person" violates foreign key constraint "personbookmark_nconst_fkey" on table "personbookmark"

看起来实体框架正在尝试删除关联的Person行,但我不知道我在哪里告诉他这样做的......我只想删除PersonBookmark行。 也许我不明白一些明显的东西,但在我看来, Person shadow 属性并不意味着关联的Person应该与其引用所有者一起消失。

有人能帮我吗?

先感谢您

看起来实体框架正在尝试删除关联的 Person 行,但我不知道我在哪里告诉他这样做的......

就在这儿

builder.HasOne(x => x.Person).WithOne()
   .HasPrincipalKey<PersonBookmark>(x => x.PersonId) // <--
   .HasForeignKey<Person>(x => x.PersonId);

对于一对一关系, HasPrincipalKey / HasForeignKey的泛型类型参数用于指定关系中谁是主体,谁是从属关系 ( docs )。 级联删除从主体到依赖方向,即删除主体级联删除依赖。

您需要在这里交换PersonPersonBookmark角色:

builder.HasOne(x => x.Person).WithOne()
   .HasPrincipalKey<Person>(x => x.PersonId)
   .HasForeignKey<PersonBookmark>(x => x.PersonId);

确保重新生成迁移并将其应用到数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM