[英]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 )。 级联删除从主体到依赖方向,即删除主体级联删除依赖。
您需要在这里交换Person
和PersonBookmark
角色:
builder.HasOne(x => x.Person).WithOne()
.HasPrincipalKey<Person>(x => x.PersonId)
.HasForeignKey<PersonBookmark>(x => x.PersonId);
确保重新生成迁移并将其应用到数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.