40

Nói rằng tôi có các định nghĩa bảng sau trong SQL Server 2008:Làm cách nào để loại bỏ Lỗi 3002?

CREATE TABLE Person 
(PersonId INT IDENTITY NOT NULL PRIMARY KEY, 
Name VARCHAR(50) NOT NULL, 
ManyMoreIrrelevantColumns VARCHAR(MAX) NOT NULL) 

CREATE TABLE Model 
(ModelId INT IDENTITY NOT NULL PRIMARY KEY, 
ModelName VARCHAR(50) NOT NULL, 
Description VARCHAR(200) NULL) 

CREATE TABLE ModelScore 
(ModelId INT NOT NULL REFERENCES Model (ModelId), 
Score INT NOT NULL, 
Definition VARCHAR(100) NULL, 
PRIMARY KEY (ModelId, Score)) 

CREATE TABLE PersonModelScore 
(PersonId INT NOT NULL REFERENCES Person (PersonId), 
ModelId INT NOT NULL, 
Score INT NOT NULL, 
PRIMARY KEY (PersonId, ModelId), 
FOREIGN KEY (ModelId, Score) REFERENCES ModelScore (ModelId, Score)) 

Ý tưởng ở đây là mỗi người có thể chỉ có một ModelScore mỗi Model, nhưng mỗi người có thể có một số điểm cho bất kỳ số mô hình được xác định. Theo như tôi có thể nói, SQL này nên thực thi các ràng buộc này một cách tự nhiên. ModelScore có một "ý nghĩa" cụ thể, được chứa trong Định nghĩa. Không có gì làm rung chuyển trái đất ở đó.

Bây giờ, tôi thử dịch thành Entity Framework bằng cách sử dụng trình thiết kế. Sau khi cập nhật mô hình từ cơ sở dữ liệu và thực hiện một số chỉnh sửa, tôi có một đối tượng Person, một đối tượng Model và một đối tượng ModelScore. PersonModelScore, là một bảng kết nối, không phải là một đối tượng mà đúng hơn là được bao gồm như một liên kết với một số tên khác (giả sử ModelScorePersonAssociation). Các chi tiết bản đồ cho hiệp hội như sau:

 
- Association 
    - Maps to PersonModelScore 
    - ModelScore 
     ModelId : Int32  <=> ModelId : int 
     Score : Int32   <=> Score : int 
    - Person 
     PersonId : Int32  <=> PersonId : int 

Về phía bên tay phải, các giá trị ModelId và PersonId có những biểu tượng khóa chính, nhưng giá trị Điểm không.

Khi biên soạn, tôi nhận được:

Error 3002: Problem in Mapping Fragment starting at line 5190: Potential runtime violation of table PersonModelScore's keys (PersonModelScore.ModelId, PersonModelScore.PersonId): Columns (PersonModelScore.PersonId, PersonModelScore.ModelId) are mapped to EntitySet ModelScorePersonAssociation's properties (ModelScorePersonAssociation.Person.PersonId, ModelScorePersonAssociation.ModelScore.ModelId) on the conceptual side but they do not form the EntitySet's key properties (ModelScorePersonAssociation.ModelScore.ModelId, ModelScorePersonAssociation.ModelScore.Score, ModelScorePersonAssociation.Person.PersonId).

đã Tôi đã làm gì sai trong thiết kế hay cách khác, và làm thế nào tôi có thể sửa chữa các lỗi?

Rất cám ơn!

+1

Bạn nên chấp nhận câu trả lời của Shan. Đó là chính xác và lưu thịt xông khói của tôi. –

Trả lời

2

Bạn nên tạo một khóa nhận dạng duy nhất cho mỗi bảng.

ModelScore phải có ModelScoreId, PersonModelScore phải có một PersonModelScoreId.

Tham chiếu giữa bảng phải là một trường duy nhất.

+1

Cảm ơn bạn đã đề xuất. Bây giờ, làm thế nào để giải pháp này vẫn bảo toàn tính toàn vẹn của mô hình dữ liệu? Mỗi Người được liên kết với không nhiều hơn một Mô hình, và ModelScore phải là một ModelScore hợp lệ cho Mô hình đó. Vì vậy, tôi nghĩ rằng PersonModelScore hoặc sẽ phải có cả một ModelId và ModelScoreId, mà là dư thừa và yêu cầu xác minh, hoặc chỉ có ModelScoreId, yêu cầu xác minh rằng không có nhiều ModelScores trên mỗi Model cho mỗi người. Cả hai cách dường như không hoạt động tốt, theo ý kiến ​​của tôi. Đây có phải chỉ là hạn chế của Khung thực thể không? – Andrew

65

Rất muộn cho câu hỏi của bạn, tôi đã gặp vấn đề tương tự và phát hiện ra rằng nhà thiết kế khung thực thể đã xác định cột "ScoreId" của tôi (liên quan đến bảng PersonModelScore) của bạn làm cột khóa chính. Tôi đã thay đổi cài đặt của mình thành false cho ScoreId của mình và tất cả đều hoạt động tốt sau đó.

+0

Bản sửa lỗi này có hiệu quả đối với tôi. Một bảng có hai khóa chính khi nó chỉ có một. – Jesslyn

+2

Tương tự ở đây. EF đã quyết định rằng tất cả các cột không phải null phải là một phần của khóa chính mà chúng không được cho là. –

+7

Nó đã cho tôi một chút để tìm ra các bước cho việc này, vì vậy thêm ở đây cho rõ ràng. Chuyển đến tệp .edmx của bạn, nhấp chuột phải vào nền và chọn 'Chi tiết bản đồ'. Nhấp vào Bảng bạn cần chỉnh sửa ánh xạ trong cửa sổ .edmx và chi tiết sẽ xuất hiện trong cửa sổ 'Chi tiết bản đồ' mới của bạn. Nhấn F4 để mở cửa sổ 'Properties' (vị trí mặc định, phía dưới bên phải màn hình VS của bạn). Nhấp vào 'Giá trị/Thuộc tính' trong 'Chi tiết bản đồ' của bạn để thay đổi Thuộc tính được hiển thị và từ cửa sổ Thuộc tính của bạn, bây giờ bạn có thể đặt giá trị 'Entity Key' thành 'False'. –

0

bảng PersonModelScore của bạn nên xác định một cột Id đó là bản sắc và khóa chính, sau đó bạn nên tạo một chìa khóa duy nhất trên PersonId, ModelId

như đối với Lỗi 3002, tôi đã cùng một vấn đề ALL lĩnh vực của tôi đã được đánh dấu Khóa thực thể bằng EF

12

Bạn có thể đặt khóa chính duy nhất trong thực thể để tránh lỗi này.Áp sáng Nhấp vào Thuộc tính vô hướng của trường trong Thực thể và tắt Khóa thực thể nếu có nhiều khóa chính.

+0

Cảm ơn bạn! Điều này giải quyết cho tôi, Lỗi Lỗi 3002: Sự cố trong phân đoạn ánh xạ bắt đầu từ dòng 942: Vi phạm thời gian tiềm năng của các khóa của bảng [tablename] ([entityname] .Id): Cột ([entityname] .Id) được ánh xạ đối với các thuộc tính EntitySet [entityset] ([tablename] .Id) ở phía khái niệm nhưng chúng không tạo thành các thuộc tính quan trọng của EntitySet –

0

"Chuyển đến tệp .edmx của bạn, nhấp chuột phải vào nền và chọn 'Chi tiết bản đồ'. Nhấp vào Bảng bạn cần chỉnh sửa ánh xạ trong cửa sổ .edmx và chi tiết sẽ xuất hiện trong 'Bản đồ' mới của bạn Mở tab Properties (nhấn F4 để hiển thị 'Properties' nếu không mở) Nhấp vào 'Value/Property' trong 'Mapping Details' để thay đổi Properties được hiển thị, và từ cửa sổ Properties bạn có thể thiết lập giá trị 'Entity Key' thành 'False' - Chris Paton Ngày 4 tháng 10 năm 2014 tại 18:54 "

Điều này làm việc cho tôi - Cảm ơn Đây là một phần công việc của tôi khi sử dụng Cơ sở dữ liệu EF Trước tiên. Và chúng tôi có một nhiệm vụ để cập nhật mô hình dữ liệu.

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