2011-09-30 36 views
6

Tôi đang sử dụng Entity Framework lần đầu tiên và tôi đang cố gắng tạo một đối tượng với một bộ sưu tập (và tôi muốn tất cả các đối tượng trong bộ sưu tập được tạo ra trong cơ sở dữ liệu) nhưng tôi có một số vi phạm khóa ngoại.Entity Framework One-To-Many Insert - Ngoại lệ vi phạm

bảng mẫu của tôi:

table APPOINTMENTS: ID, VAR1, DATE_APPOINTMENT 
table GUESTS: ID, APPOINTMENT_ID, USER_ID, VAR2, VAR3 

mã kiểm tra của tôi:

DomainService aux = new DomainService(); 

APPOINTMENTS appointment = new APPOINTMENTS(); 
appointment.VAR1 = "BLA"; 
appointment.DATE_APPOINTMENT = new DateTime(); 

//The user with id = 1 is already created in the database 
appointment.GUESTS.Add(new GUESTS { USER_ID = 1, VAR2 = 1, VAR3 = "F" }); 

aux.InsertAppointment(appointment); 

Tại DomainService tôi có:

public void InsertAppointment(APPOINTMENTS appointment) 
{ 
    using (var context = this.ObjectContext) 
    { 
     context.AddToAPPOINTMENTS(appointment); 
     context.SaveChanges(); 
    } 
} 

Nhưng tôi nhận được lỗi này: { "ORA -02291: ràng buộc toàn vẹn (FK_GUESTS_APPOINTMENTS) vi phạm - không tìm thấy khóa chính "}

Tôi đang làm gì sai?

CẬP NHẬT: Để tạo ID trong cơ sở dữ liệu, tôi đang sử dụng chuỗi cho mỗi bảng và trình kích hoạt trước khi chèn để nhận giá trị tiếp theo. Khi tôi tạo một đối tượng, ví dụ: một cuộc hẹn mà không có khách, nó chèn vào cơ sở dữ liệu và nó tạo ra id.

+0

tôi đã làm chính xác điều tương tự trong EF và nó hoạt động cho tôi. Các khóa chính trong cả hai bảng là số tự động. Tôi đang sử dụng máy chủ sql để lưu trữ dữ liệu –

+0

Tôi đang sử dụng chuỗi và trình kích hoạt trước khi chèn ...Khi tôi cố gắng tạo một cuộc hẹn mà không có khách, nó tạo ra một ID, và khi tôi cố gắng tạo một khách với một cuộc hẹn hiện tại, nó hoạt động chính xác cũng – Canastro

+0

@MuhammadAdeelZahid Ông đang sử dụng Oracle, chứ không phải SQL Server –

Trả lời

4

Các giải pháp cho vấn đề này:

"The ID fields that are generated from sequences won't be handled correctly. After saving the entities the ID's will be returned as 0. I'll fix this by manually hacking the SSDL (open your .edmx file in a text editor) with StoreGeneratedPattern="Identity" attributes on the ID fields (lines 6 and 16). Note that designer may rip that change out upon future modification.

While I suppose it's not absolutely necessary it might also be prudent to modify some type metadata such as changing "number"s to "int"s in your SSDL and "Decimal"s to "Int32"s in your CSDL where applicable. Frequently these don't auto-generate with the desired values especially with XE."

@http: //www.chrisumbel.com/article/oracle_entity_framework_ef

+0

0

Tôi không thể biết vị trí bạn đang đặt Khóa chính (thuộc tính ID của lớp cuộc hẹn). Bạn có đang sử dụng trình tạo khóa ở phía cơ sở dữ liệu không? Nếu không thì đây là vấn đề.

+0

Tôi đang sử dụng một chuỗi và trình kích hoạt nhận giá trị tiếp theo trước khi chèn. – Canastro

-1

Bạn đang chèn bản ghi có giá trị khóa ngoài không được tìm thấy trong bảng cha mà ràng buộc đề cập đến.

+1

Vâng, không phải là giả sử các khung thực thể để chèn các cuộc hẹn và khách với các APPOINTMENT_ID FK currect? – Canastro

+0

Tôi không phải là lập trình viên java, vì vậy tôi không biết khung thực thể của bạn làm gì hoặc không làm. Nếu khuôn khổ được cho là để chèn phụ huynh đầu tiên, là nó có thể bạn có nhiều thiết lập để làm cho đối tượng của bạn? Nhìn vào mã của bạn, nếu tôi đọc đúng, bạn đang tạo GUEST trước APPOINTMENT, với GUEST.APPOINTMENT_ID là khóa ngoại trở lại APPOINTMENT.APPOINTMENT_ID. Khi tạo đối tượng GUEST, bạn có bản ghi trong bảng APPOINTMENT với APPOINTMENT_ID = 1 không? –

+0

Tìm ra vấn đề. Đó là một vấn đề lập bản đồ ... Bạn cần thực hiện một vài thay đổi đối với ánh xạ được tạo để có thể thực hiện điều này. EF không thích Oracle xD – Canastro

1

Đối với tôi, vấn đề đã được giải quyết đơn giản bằng cách mở sơ đồ .edmx và thay đổi thuộc tính StoreGeneratedPattern từ None thành Identity cho mỗi Primary Key trong mỗi bảng. Sau khi lưu mọi thứ đều ổn.

Tôi đang sử dụng VS 2012, Entity Framework 5 (6 chưa được hỗ trợ), Oracle 11.2, cuối cùng ODP.NET 12, Net 4.5

1

Trong trường hợp của phương pháp đang EF đầu tiên, nếu lỗi này đi

(ORA-02291: integrity constraint (FK_GUESTS_APPOINTMENTS) violated - parent key not found)

Trong trường hợp của tôi có 2 bảng có cột Nhận dạng. Vì vậy, tôi chỉ cần thêm tài sản

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

đến lớp mô hình của tôi ngay trên cột đó là cột sắc trong cơ sở dữ liệu và nó giải quyết vấn đề của tôi :)

Hope trợ giúp này :)

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