2011-11-19 31 views
5

Tôi đã đọc qua các câu hỏi ở đây dường như lúc đầu có vấn đề tương tự nhưng dường như không giống nhau. Rất nhiều lời xin lỗi nếu điều này được trả lời ở đâu đó nhưng giống như tôi nói tôi đã đọc qua tải và không thể tìm thấy câu trả lời.Vi phạm chính về việc thêm mối quan hệ từ nhiều bảng vào khung MVC 3

Tôi đang sử dụng Entity Framework và MVC 3. Tôi đang cố thêm thẻ vào sản phẩm trong khung thực thể của mình, có mối quan hệ nhiều đến nhiều và bảng liên kết chúng chỉ với hai phím trong bảng liên kết , do đó, EF ngưng tụ Thẻ thành thuộc tính của Sản phẩm. Bàn được thiết lập như sau:

sản phẩm: ProductID [int, khóa chính], Tên vv

Tags: TagName [chuỗi, khóa chính]

ProductTags: ProductID, TagName

Vì vậy, để truy cập ProductTags tôi chỉ có thể sử dụng product.Tags

Đây là mã của tôi:

dbProduct.Tags.Clear(); 
foreach (var tag in productModel.Tags) 
{ 
    Data.Tag dbTag = new Data.Tag(); 
    dbTag.TagName = tag; 
    dbProduct.Tags.Add(dbTag); 
} 

dbProduct là thực thể Sản phẩm và Dữ liệu là không gian tên. productModel.Tags là một List<string>

Khi tôi SaveChanges() tôi nhận được ngoại lệ sau đây:..

"Vi phạm các PRIMARY KEY constraint 'PK_Tags_1' Không thể chèn khóa trùng lặp trong đối tượng 'dbo.Tags' \ r \ nBáo cáo đã bị hủy . "

Vì vậy, điều thực sự khiến tôi là: tại sao nó lại cố thêm bất kỳ thứ gì vào dbo.Tags? Dường như với tôi, điều này chỉ cần thêm vào ProductTags chứ không phải Thẻ. Tôi không đề cập đến các thẻ ở những nơi khác trong phương pháp này và do đó, không có lúc nào cố thêm bất kỳ thứ gì trực tiếp vào bảng Thẻ. Có vẻ như tôi có thể có thứ gì đó sai trong EF nhưng tôi không thể nghĩ nó được tạo ra từ cơ sở dữ liệu gì.

Xin lỗi một lần nữa nếu điều này là hiển nhiên, tôi cảm thấy khá ngu ngốc. Bất kỳ trợ giúp rất nhiều đánh giá cao.

Trả lời

11

Vấn đề là bạn đang tạo đối tượng Tag mới với khóa chính hiện có. Khi SaveChanges() được gọi là EF phát hiện các thay đổi của các thực thể đã được theo dõi và các thực thể mới được thêm vào. Vì đối tượng Tag mới của bạn không được EF theo dõi, nên nó sẽ cố gắng chèn nó.

Bạn cần nói rõ với EF rằng thẻ đã tạo là thẻ hiện tại. Để làm điều đó bạn cần phải attach nó.

dbProduct.Tags.Clear(); 
foreach (var tag in productModel.Tags) 
{ 
    Data.Tag dbTag = new Data.Tag(); 
    dbTag.TagName = tag; 

    db.TagSet.Attach(dbTag); 

    dbProduct.Tags.Add(dbTag); 
} 

Mã này giả định rằng bạn không gắn thẻ duy nhất nhiều lần và tất cả thẻ là thẻ hiện tại.

+0

Chúa ơi cảm ơn bạn. Tôi đã chơi đùa với Attach nhưng hoàn toàn hiểu lầm cách nó hoạt động. Đó là cố định nó. Rất tiếc, tôi không thể 'Bình chọn bạn' vì tôi mới đăng ký nhưng cảm ơn bạn. Bạn có một số nghiệp tốt đang đến với bạn. – Smeats

+0

@ user1054799 tuyệt vời. Bạn có thể đánh dấu phần này là câu trả lời được chấp nhận :) – Eranga

+0

Xong. Cảm ơn một lần nữa. – Smeats

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