2009-06-18 28 views
7

Là kết quả của một bài đăng biểu mẫu, tôi đang cố lưu một bản ghi Thương hiệu mới. Theo quan điểm của tôi, Giới tính là một thả xuống, trả lại một Integer, đó là dân cư từ ViewData ("giới tính")Entity Framework EntityKey/Sự cố khóa ngoài

tôi đã thiết lập liên kết của tôi như sau:

gID = CInt(Request.Form("Gender")) 
Brand.GenderReference.EntityKey = New EntityKey("DB_ENTITIES.Gender", "Id", gID) 
TryUpdateModel(Brand) 
DB.SaveChanges() 

Những kết quả trong các lỗi sau.

Entities in 'DB_ENTITIES.Brand' participate in the 'FK_Brand_Gender' relationship. 0 related 'Gender' were found. 1 'Gender' is expected. 

Ai đó có thể giải thích thông số bằng tiếng Anh đơn giản cho tôi. Tôi cũng đã thử DB.Gender là tham số đầu tiên nhưng không có niềm vui.

Trả lời

18

Thay vì tạo ra một EntityKey tạo ra một đối tượng còn sơ khai Gender (xin lỗi tôi không phải là một chàng trai VB như vậy trong C#):

Gender g = new Gender{ID = Int32.Parse(Request.Form("Gender"))}; 

Sau đó, bạn gắn Giới tính cho phù hợp EntitySet (các tên của tài sản trên DB mà bạn nhận được các đơn vị giới tính từ là chuỗi dưới đây):

DB.AttachTo("Genders",g); 

này đặt cơ sở dữ liệu trong tiểu bang nơi Giới tính nằm trong trạng thái ObjectContext ở trạng thái không thay đổi mà không có truy vấn cơ sở dữ liệu. Bây giờ bạn có thể xây dựng mối quan hệ theo bình thường

brand.Gender = g; 
DB.AddToBrand(brand); 
DB.SaveChanges(); 

Đó là tất cả. Không cần phải muck xung quanh với EntityKeys

Hope this helps

Alex

+0

Cảm ơn bạn đã trả lời Alex - nhận ngay bây giờ: Một đối tượng có cùng khóa đã tồn tại trong ObjectStateManager. ObjectStateManager không thể theo dõi nhiều đối tượng bằng cùng một khóa. – Paul

+0

Paul, làm cách nào bạn giải quyết vấn đề 'nhiều đối tượng có cùng khóa'? Tôi cũng vậy. – Picflight

+2

Trước khi đính kèm một cái gì đó vào ngữ cảnh, bạn nên kiểm tra ObjectStateManager bằng cách sử dụng LINQ to Objects để kiểm tra xem cùng một đối tượng chưa có. –

1

Điều bạn cần là một ví dụ về cả Thương hiệu và Giới tính và sau đó đặt Brand.Gender thành cá thể Giới tính. Sau đó, bạn có thể tiết kiệm mà không có vấn đề.

+0

Điều đó không liên quan đến một chuyến đi vòng đến DB của tôi? Chắc chắn View đang đăng lại một ID có thể được gắn lên. – Paul

+0

Nó phụ thuộc, nếu các đối tượng đã có trong ngữ cảnh, nó không yêu cầu một chuyến đi đến db. Alex James code là tốt để sử dụng (nó khá nhiều như tôi đã viết). –

0

Ok heres những gì tôi đã đưa ra thay vì sử dụng updateModel. Dường như có vấn đề/có khả năng xảy ra rủi ro bảo mật với các trường có khả năng bổ sung được thêm vào bài đăng. Một thể hiện Giới tính mới có thể được khởi tạo qua trygetObjectByKey. Điều này đang làm việc cho đến nay. Bất kỳ đề xuất nào khác về việc cập nhật UpdateModel để cập nhật đối tượng thuộc tính Giới tính được đánh giá cao.

Dim cID As Integer 
cID = CInt(Request.Form("Gender")) 
Dim key As New EntityKey(DB.DefaultContainerName() & ".Gender", "ID", cID) 

Dim objGenderDS As New Gender 
'Bring back the Gender object. 
If DB.TryGetObjectByKey(key, objGenderDS) Then 
Brand.GenderReference.EntityKey = key 
Brand.Gender = objGenderDS 
DB.AddToBrand(Brand) 
DB.SaveChanges() 
Else 
End If