6

Bắt đầu một ứng dụng ASP.NET MVC 3 mới và nhận được lỗi sau:Làm cách nào để xóa bản ghi có ràng buộc khóa ngoài?

The primary key value cannot be deleted because references to this key still exist.

Làm thế nào để giải quyết này?

Models (EF mã đầu tiên)

public class Journal 
{ 
    public int JournalId { get; set; } 
    public string Name { get; set; } 
    public virtual List<JournalEntry> JournalEntries { get; set; } 
} 
public class JournalEntry 
{ 
    public int JournalEntryId { get; set; } 
    public int JournalId { get; set; } 
    public string Text { get; set; } 
} 

khiển

// 
// POST: /Journal/Delete/5 

[HttpPost, ActionName("Delete")] 
public ActionResult DeleteConfirmed(int id) 
{    
    Journal journal = db.Journals.Find(id); 
    db.Journals.Remove(journal); 
    db.SaveChanges(); // **exception occurs here** 
    return RedirectToAction("Index"); 
} 

DB Cài đặt

public class FoodJournalEntities : DbContext 
{ 
    public DbSet<Journal> Journals { get; set; } 
    public DbSet<JournalEntry> JournalEntries { get; set; } 
} 
+1

Trong cơ sở dữ liệu, bạn có thể chọn tùy chọn xóa tầng cho bảng cha của bạn không? – Pankaj

+0

Câu trả lời của bạn có thể [ở đây] (http://stackoverflow.com/a/5522422/60761) rồi. Nếu không, hãy đăng mã DbSetup. Bạn có thể xóa Chế độ xem. –

+0

@PankajGarg - Tôi đã xác minh cơ sở dữ liệu đã có bộ này. –

Trả lời

15

Tìm thấy giải pháp:

public class FoodJournalEntities : DbContext 
{ 
    public DbSet<Journal> Journals { get; set; } 
    public DbSet<JournalEntry> JournalEntries { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Journal>() 
       .HasOptional(j => j.JournalEntries) 
       .WithMany() 
       .WillCascadeOnDelete(true); 
     base.OnModelCreating(modelBuilder); 
    } 
} 

Source

+0

oh tuyệt vời, bạn đã trả lời tự của bạn :) –

+0

+1 điểm cho rằng –

+0

@ 白 ジ ェ ー ム ス là bạn thực sự "13" tuổi? –

7

Nếu bạn xóa một rec ord từ một bảng (cho phép nói "blah"), trong đó có các mối quan hệ khác với các bảng khác (xyz, abc). Theo mặc định, cơ sở dữ liệu sẽ ngăn bạn xóa hàng trong "blah" nếu có các hàng liên quan ở một trong các bảng khác.
Giải pháp # 1:
Bạn có thể xóa các hàng có liên quan trước tiên, điều này có thể yêu cầu nhiều công việc.
Giải pháp # 2:
giải pháp dễ dàng là định cấu hình cơ sở dữ liệu để xóa chúng tự động khi bạn xóa hàng "blah".

Follow mở sơ đồ cơ sở dữ liệu của bạn này, và bấm vào các thuộc tính về mối quan hệ

enter image description here

Trong cửa sổ Properties, mở rộng INSERTCẬP NHẬT Thông số kỹ thuật và thiết lập DeleteRule tài sản để Cascade.
enter image description here

Lưu và đóng biểu đồ. Nếu bạn được hỏi có muốn cập nhật cơ sở dữ liệu không, hãy bấm Có.

Để đảm bảo rằng mô hình giữ các thực thể trong bộ nhớ đồng bộ với cơ sở dữ liệu đang làm gì, bạn phải đặt các quy tắc tương ứng trong mô hình dữ liệu. Mở SchoolModel.edmx, bấm chuột phải vào dòng kết hợp giữa "blah" và "xyz", sau đó chọn Thuộc tính.

Trong cửa sổ Properties, mở rộng INSERTCẬP NHẬT Thông số kỹ thuật và thiết lập DeleteRule tài sản để Cascade.

Solution and images taken from http://www.asp.net/web-forms/tutorials/getting-started-with-ef/the-entity-framework-and-aspnet-getting-started-part-2

+0

Giải pháp này có vẻ phù hợp với EF 4.1. DB đã thiết lập rồi. –

-1

Tôi tìm thấy nó ...

Tới SQL Server

Hãy Cơ sở dữ liệu của mình diagrammed

Nhấp chuột phải vào dòng tàu mối quan hệ giữa cha mẹ và con và mở thuộc tính của nó.

Đặt INSERT và thông số kỹ thuật cập nhật và chỉ cần đặt DELETE RULE TO CASCADE.

Hãy nhớ Không có mã được yêu cầu trong Dự án CHO MỤC ĐÍCH này và chỉ cần gỡ lỗi và thưởng thức nó.

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