7

Tôi thực hiện một hai chiều 1: 1 mối quan hệ dựa trên câu trả lời này:Cascade Xóa Rule trong EF 4.1 Mã đầu tiên khi sử dụng Hiệp hội Shared Primary Key

Primary /Foreign Key in Entity Framework

tôi xác định các mối quan hệ hai chiều theo cách này:

public class Student 
{ 
    public virtual int StudentId { get; set; } 
    public virtual Anamnesis Anamnesis { get; set; } 

    . . . 
} 

public class Anamnesis 
{ 
    [Key, ForeignKey("Student")] 
    public int AnamnesisId { get; set; } 

    public virtual Student Student { get; set; } 

    . . . 
} 

ở đâu, Sinh viên là thực thể chính và Anamnesis là thực thể chia sẻ PK.

Bây giờ tôi muốn mối quan hệ được tạo có Quy tắc xóa = CASCADE. Trên thực tế, mối quan hệ đang được tạo ra có Xóa Rule = NO HÀNH ĐỘNG như đã thấy trong hình sau:

enter image description here

Nếu tôi tự xóa mối quan hệ này bên trong cửa sổ Thuộc tính bảng và thêm mối quan hệ khác với Xóa Rule = CASCADE , mã hoạt động như tôi mong đợi cho phép tôi xóa một Sinh viên và nó được chia sẻ Anamnesis có cùng một ID.

Vì vậy, ở đây đi câu hỏi của tôi:

Có cách nào của việc sử dụng dữ liệu Chú thích (không thạo API) trong lớp học của tôi để tôi có được một quan hệ với CASCADE xóa quy tắc? Tôi muốn sử dụng Chú thích dữ liệu nhưng nếu không thể, tôi sẽ hài lòng với một số mã API Fluent mà làm cho công việc này.

LƯU Ý

Tôi đã thử mã API thạo được hiển thị trong post này. Nó không hoạt động trong trường hợp của tôi, nơi tôi có các thuộc tính hai chiều.

+0

Uhmmm ... bây giờ tôi đã đăng câu hỏi tôi thấy rằng tôi đã quên từ khóa 'virtual' cho thuộc tính' AnamnesisId' để tuân thủ với câu trả lời của Ladislav liên kết ở trên. Có lẽ đây là vấn đề. Tôi phải kiểm tra lại tất cả. : D –

+0

Bạn có thể hiển thị mã đầy đủ không? EF code-first sử dụng cascade delete theo mặc định mỗi khi có thể và cả hai ví dụ của tôi trong câu hỏi được liên kết đều sử dụng nó. –

+0

@Ladislav: kiểm tra lại và kiểm tra mối quan hệ được tạo trong cơ sở dữ liệu. Nó vẫn như cũ. Không có CASCADE. Vì vậy, từ khóa ảo không phải là vấn đề. Mã xác định mối quan hệ là mã tôi hiển thị ở trên. Bạn có cần gì hơn không? –

Trả lời

10

Mã API thông thạo sau một cách hoàn hảo bật cascade xóa trên cơ sở dữ liệu:

public class Student 
{ 
    public virtual int StudentId { get; set; } 
    public virtual Anamnesis Anamnesis { get; set; } 
} 

public class Anamnesis 
{   
    public int AnamnesisId { get; set; } 
    public virtual Student Student { get; set; } 
} 

public class Context : DbContext 
{ 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Anamnesis> Anamnesises { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Student>() 
        .HasRequired(s => s.Anamnesis) 
        .WithRequiredPrincipal(a => a.Student) 
        .WillCascadeOnDelete(); 
    } 
} 

enter image description here

+0

Cảm ơn! Điều này đã làm các trick. Nhân tiện: bạn có một blog tuyệt vời. Theo kịp công việc tuyệt vời bạn đang làm ở đây và ở đó. Chúa ban phước cho cuộc sống của bạn. –

+0

@Leniel: Cảm ơn những lời tốt đẹp của bạn và thật vui khi biết rằng bạn đã tìm thấy các bài đăng trên blog hữu ích :) –

+0

Giải pháp này phù hợp với tôi, tôi chỉ muốn có một Chú thích dữ liệu tương đương cũng hoạt động. – angularsen

7

Ngoài ra, bạn có thể sử dụng [Bắt buộc] Thuộc tính, và nó sẽ tự động thiết lập các quy tắc xóa để Chế độ "CASCADE" trong mối quan hệ liên quan. (và cũng đặt thuộc tính "Allow Null" của thực thể đó thành "false" trong DB)

Các vấn đề liên quan