2010-07-02 35 views
16

Có ai đó đã triển khai trình tạo khóa HiLO cho Khung thực thể.HiLO cho Khung thực thể

Đọc thêm về HiLo tại đây: Tôi khuyên bạn nên đọc http://fabiomaulo.blogspot.com/2009/02/nh210-generators-behavior-explained.html để biết giải thích chi tiết về các nhược điểm của việc chọn nhận dạng.

+1

nếu bạn đang sử dụng SQL Server, hãy xem xét các kiểu dữ liệu uniqueidentifier thêm vào SQL Server. –

+0

Điều gì, chính xác, là câu hỏi của bạn? – Crisfole

Trả lời

0

Khuôn khổ thực thể IMO không có bất kỳ tương đương với máy phát của NHibernate. Tính năng duy nhất có sẵn trong EF là StoreGeneratedPattern có thể được đặt thành Identity. StoreGeneratedPattern đơn giản có nghĩa là DB sẽ gán một khóa và khóa được trả về như một phần của hoạt động chèn trở lại ngữ cảnh EF (khó hơn với các hướng dẫn).

Nếu bạn muốn có một số tương đương với máy phát POID NHibernate, bạn phải ghi đè SaveChanges hoặc xử lý SavingChanges trên ObjectContext của bạn. Sau đó, bạn có thể gán ID theo cách thủ công cho tất cả các thực thể được chèn từ thuật toán POID mà bạn chọn - nhưng bạn phải triển khai thuật toán.

1

Thật không may, EF không có gì gần gũi với các máy phát POID như NHibernate, mặc dù tôi nghe tin đồn rằng các khả năng tương tự sẽ được đưa vào bản phát hành tiếp theo của EF. (Cái gì?!? Microsoft đồng chọn ý tưởng tốt của một đối thủ cạnh tranh? Không thể hiểu được!)

Sẽ không quá khó để xử lý phần Lo của chính chúng ta, nhưng phần Hi sẽ rất khó trừ khi chúng tôi có thể nhận EF hợp tác. Điều đó sẽ đưa Microsoft đến các bộ phận tái cấu trúc của EF, đó có lẽ là lý do tại sao không ai cố gắng làm điều đó và xuất bản nó như một dự án mã nguồn mở trên github hoặc codeplex.

Trong thời gian chờ đợi, những gì chúng tôi đã sử dụng để tạo bản ghi ngoại tuyến và sau đó đồng bộ hóa sau đó là số nhận dạng duy nhất toàn cầu.

var id = Guid.NewGuid(); 

Sau đó gán nó vào id của bảng. Điều này có thể được thực hiện trong SaveChanges.

Tôi biết nó không tốt bằng HiLo nhưng nó gần như chúng tôi đã đến. Nó vẫn có những lợi thế của việc có thể làm việc ngoại tuyến và đảm bảo id hợp lệ và duy nhất.

2

Cảm ơn câu trả lời

Tôi nghĩ mình phải đợi :-) EF đang di chuyển đúng hướng yêu thích CTP5.

Tôi cần nhận xét về câu trả lời từ "Rap". Sử dụng ngẫu nhiên Guid's như các chỉ mục có thể thực sự làm chậm hiệu năng trên SQL Server vì các chỉ mục cho mỗi chèn sẽ bị phân mảnh. Điều này tôi đã học hỏi từ thế giới thực, khi tôi bắt đầu làm việc tại một công ty mới có vấn đề lớn với hiệu năng trên máy chủ sql đó. chuyển từ guid sang bigint đã giải quyết được vấn đề. và không cần phải reindex mọi lúc.

+0

Vâng, đó là sự thật. Cuộc gọi tốt, @martin. Tôi chỉ nói rằng kể từ khi EF chưa có, đó là tất cả những gì chúng tôi đã có ngay bây giờ. – Rap

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