Sử dụng phương pháp tiếp cận mã nguồn mở Entity Framework.Cách nào xung quanh việc xóa tầng sẽ đi theo mối quan hệ một-nhiều?
Giả sử tôi có hai lớp thực thể:
[Table("Objects")]
public class DbObject : IValidatableObject
{
public long Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<DbObjectProperty> Properties { get; set; }
}
[Table("ObjectProperties")]
public class DbObjectProperty
{
public long Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
[Display(Name = "Object"), UIHint("Object")]
public long ObjectId { get; set; }
public virtual DbObject Object { get; set; }
}
điểm cần lưu ý ở đây:
DbObject
chỉ có một tài sản chuyển hướng, nhưng không có cột với nước ngoài chủ chốtDbObjectProperty
có một chuyển hướng thuộc tính và cột tương ứng với khóa ngoài- I t rõ ràng là nếu tôi xóa một đối tượng, tôi muốn các thuộc tính của nó đi cùng với nó, nhưng nếu tôi xóa một thuộc tính duy nhất, tôi không muốn toàn bộ đối tượng biến mất.
Trong phương pháp OnModelCreating
cho bối cảnh DB, cho đến bây giờ tôi đã có sau đây để xác định mối quan hệ:
modelBuilder.Entity<DbObjectProperty>()
.HasRequired(op => op.Object)
.WithMany(obj => obj.Properties)
.HasForeignKey(op => op.ObjectId)
.WillCascadeOnDelete(false);
Tất nhiên, điều này có nghĩa là không xóa cascaded sẽ xảy ra. Câu hỏi của tôi là: nếu tôi thay đổi điều này thành true
, điều đó có làm những gì tôi muốn không? Hãy nhớ rằng nếu tôi xóa một đối tượng, tôi muốn các thuộc tính của nó đi cùng với nó, nhưng nếu tôi xóa một thuộc tính duy nhất, tôi không muốn toàn bộ đối tượng biến mất.
Mã di cư tự động tạo ra cho sự thay đổi này (từ false
để true
) là thế này:
DropForeignKey("ObjectProperties", "ObjectId", "Objects");
DropIndex("ObjectProperties", new[] { "ObjectId" });
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true);
CreateIndex("ObjectProperties", "ObjectId");
Tôi lo lắng rằng điều này dường như ngụ ý rằng việc xoá một tài sản sẽ xóa đối tượng liên quan. Nó sẽ?
[Cảm ơn!] (Http://meta.stackexchange.com/questions/700/) – Timwi
Quy tắc chung là, với xóa tầng, nếu xóa một bản ghi phá vỡ khoá ngoại từ một bản ghi khác, bản ghi phụ thuộc đó sẽ bị xóa quá. – orad
Vì vậy, 'modelBuilder.Entity() .HasMany (p => p.Children) .WithOne (c => c.Parent)' giống với 'modelBuilder.Entity () .HasOne (c => c.Parent) .WithMany (p => p.Children) '(chúng chỉ định cùng mối quan hệ)? –