2011-02-23 31 views
7

Tôi có mô hình đơn giản với một "BaseEntity" và một thực thể "Quỹ" có nguồn gốc. Khi tôi cố gắng để chèn một quỹ mới:Khuôn khổ thực thể 4: Vấn đề thừa kế Bảng trên loại trên chèn

HybridModelContainer container = new HybridModelContainer(); 

//Create new Fund 
Fund fund = new Fund(); 
fund.Id = Guid.NewGuid(); 
fund.DateCreated = DateTime.Now; 
fund.Name = "Fund 1"; 
fund.Number = 1; 
container.BaseEntities.AddObject(fund); 

container.SaveChanges(); 

tôi nhận được lỗi sau:

"Cannot insert the value NULL into column 'Id', table 'HybridData.dbo.BaseEntities'; column does not allow nulls. INSERT fails.
The statement has been terminated."

Dường như ID giao cho đơn vị quỹ không được chèn vào bảng BaseEntity. Tại sao không?

Tôi đã làm "mô hình đầu tiên" này. Nếu tôi thiết kế cơ sở dữ liệu đầu tiên, và tạo ra mô hình từ nó, mọi thứ hoạt động tốt .... Nhưng tôi cần mô hình đầu tiên!

enter image description here

Ngoài ra ... tại sao không có một ObjectSet cho "Funds" trong tôi DataContext (ví dụ: container.Funds)? Cảm ơn trước sự giúp đỡ của bạn!

+0

'HybridModelContainer' là gì? Đăng ảnh chụp màn hình chi tiết bản đồ cho thực thể 'Fund' của bạn. –

+0

Đó chỉ là tên của DataContext. – SolarX

+0

@SolarX: Bạn có thể đăng ảnh chụp màn hình mà tôi đã đề cập không? –

Trả lời

9

Tôi chỉ có thể trả lời phần thứ hai của câu hỏi của bạn: "Ngoài ra ... tại sao không có một ObjectSet cho" Funds "trong DataContext của tôi (nghĩa là container.Funds)?"

Điều bình thường là ObjectContext chỉ có một ObjectSet của lớp cơ sở trong phân cấp lớp của bạn. Không thực sự cần một ObjectSet của các lớp dẫn xuất. Để thêm và xóa các đối tượng có nguồn gốc vào/từ ObjectContext, bạn chỉ có thể sử dụng các phương thức AddObjectDeleteObject của ObjectSet<BaseEntity>/BaseEntities như bạn đã làm trong ví dụ của mình.

Để truy vấn đối tượng có nguồn gốc, bạn có thể tận dụng phương pháp OfType của ObjectSet. Nó trả về một ObjectQuery của các loại có nguồn gốc, nơi bạn có thể xây dựng các truy vấn thêm khi:.

ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>(); 

(Phần đầu của câu hỏi của bạn có vẻ là một lỗi ánh xạ giữa việc lưu trữ và mô hình khái niệm nó có thể có một tốt hơn CIF bạn có thể hiển thị các phần có liên quan của tập tin edmx của bạn)

Edit:. giải pháp có thể để phần đầu của câu hỏi:

tôi đã tạo ra ví dụ của bạn với Model đầu tiên trong VS2010 và tôi có thể sinh sản của bạn vấn đề. Vấn đề dường như liên quan đến thực tế là khóa chính trong mô hình của bạn không phải là Int32 mà là một Guid. Khi bạn thêm một thực thể mới vào Mô hình, nhà thiết kế luôn đề xuất Int32 làm khóa chính với StoreGeneratedPattern được đặt thành Identity.

Nếu bạn thay đổi bây giờ là loại chìa khóa trong thiết kế mô hình Int32-Guid nhưng để lại StoreGeneratedPattern không thay đổi là Identity, DDL tạo ra một cơ sở dữ liệu trong SQL Server với Id bộ gõ uniqueidentifier nhưng nhận dạng đặc điểm kỹ thuật cho cột đó là "Không". Vì vậy, khi EF gửi lệnh INSERT tới DB nó "nghĩ" từ định nghĩa mô hình, phần chính sẽ được tự động phát trong DB và không gửi hướng dẫn tới DB mà bạn đã gán trong mã. Nhưng DB không tạo khóa, dẫn đến giá trị NULL cho khóa. Do đó lỗi chúng tôi nhận được.

Giải pháp: Đặt trong trình thiết kế mô hình cho thuộc tính Id của BaseEntity số StoreGeneratedPattern đến None. Đối với tôi nó làm việc sau đó. Tất nhiên, bạn có trách nhiệm sau đó để luôn luôn chỉ định một hướng dẫn để Id trước khi bạn thêm một đối tượng mới vào ObjectSet, nhưng điều đó có vẻ là những gì bạn muốn anyway.

+0

Cảm ơn bạn. Tôi đã thử cùng một điều với một phương pháp tiếp cận cơ sở dữ liệu đầu tiên và tất cả mọi thứ hoạt động tìm thấy (sau khi loại bỏ các mối quan hệ và thiết lập kế thừa trong mô hình). Tôi không thể làm điều này để làm việc với phương pháp "mô hình đầu tiên". Nhưng chúng tôi muốn đi mô hình đầu tiên. Bất kỳ ý tưởng? – SolarX

+0

@SolarX: Có lẽ tôi đã tìm ra giải pháp: Xem phần Chỉnh sửa trong câu trả lời của tôi ở trên. – Slauma

+0

Tôi sẽ cố gắng điều này ngay sau khi tôi nhận được các cuộc họp của tôi ... Tôi đã hy vọng nó là một vấn đề với Guid. Tôi tò mò rằng tôi không thể tìm thấy bất cứ điều gì trên trang web đó. Cảm ơn rất nhiều vì sự giúp đỡ của bạn !! – SolarX

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