2013-04-30 28 views
9

Tôi đang đến từ một nền nhibernate và tôi tự hỏi làm thế nào tôi có thể tạo ra các Guid tự động ở phía serer và không thực hiện một chuyến đi vòng để làm cho nó ở phía cơ sở dữ liệu?Tạo Hướng dẫn về Khung đối tượng Serverside 5?

Trong nhibernate thạo nó là đơn giản chỉ

Id(x => x.Id).GeneratedBy.GuidComb(); 

Trả lời

15

Nếu bạn muốn tạo phím trên máy chủ, bạn chỉ cần làm điều này trong mã:

public class TestObject 
{ 
    public TestObject() 
    { 
     Id = Guid.NewGuid(); 
    } 
    public Guid Id { get; set; } 
} 

Nếu bạn muốn cơ sở dữ liệu để tạo ra , sau đó sử dụng thuộc tính DatabaseGenerated:

public class TestObject 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 
} 

Nếu bạn đang sử dụng chuỗi GUIDs, sau đó không có câu trả lời dễ dàng vào lúc này. Một số ví dụ mà giúp bạn dọc theo con đường bên phải:

+0

Trong Nhibernate họ có GuidComb những gì được cho là tốt hơn. Liệu nó không quan trọng với EF? Bất kỳ lợi thế nào giữa 2 cách trong EF. Trong nhibernate họ không khuyên bạn nên làm db tạo ra. – chobo2

+0

Ah, không nhận thức được sự khác biệt của COMB. Đã cập nhật câu trả lời với một số tùy chọn khác. – Richard

+2

Lưu ý, nếu bạn đang tạo từ ** edmx **, hãy đảm bảo rằng ** Cột đã tạo cửa hàng ** được đặt thành ** Identity ** cho cột bạn muốn GUid được tạo máy chủ. –

1

Mã này làm những gì bạn cần:

using System; 
using System.Runtime.InteropServices; 
public static class SequentialGuidProvider 
{ 
    [DllImport("rpcrt4.dll", SetLastError = true)] 
    private static extern int UuidCreateSequential(out Guid guid); 

    private static Guid CreateGuid() 
    { 
     Guid guid; 
     int result = UuidCreateSequential(out guid); 
     if (result == 0) 
      return guid; 
     else 
      return Guid.NewGuid(); 
    } 

    public static Guid GuidComb(this Nullable<Guid> guid) 
    { 
     if (!guid.HasValue) guid = SequentialGuidProvider.CreateGuid(); 
     return guid.Value; 
    } 
} 

thử nghiệm lớp học:

public class TestObject 
{ 
    public TestObject() 
    { 
    } 

    private Nullable<Guid> _guid = null; 
    public Guid Id 
    { 
     get 
     { 
      _guid = _guid.GuidComb(); 
      return _guid.Value(); 
     } 
     set 
     { 
      _guid = value; 
     } 
    } 
} 

mã kiểm tra:

static void Main(string[] args) 
    { 
     TestObject testObject1 = new TestObject(); 
     TestObject testObject2 = new TestObject(); 
     TestObject testObject3 = new TestObject(); 
     //simulate EF setting the Id 
     testObject3.Id = new Guid("ef2bb608-b3c4-11e2-8d9e-00262df6f594"); 

     //same object same id 
     bool test1 = testObject1.Id == testObject1.Id; 
     //different object different id 
     bool test2 = testObject1.Id != testObject2.Id; 
     //EF loaded object has the expected id 
     bool test3 = testObject3.Id.Equals(new Guid("ef2bb608-b3c4-11e2-8d9e-00262df6f594")); 
    } 
+0

hmm không theo dõi điều này. Tôi làm cho một forloop với một GUID nullable và chuyển nó vào phương pháp Guidcomb và nó vẫn tạo ra cùng một Guid. Vì vậy, không chắc chắn nếu thực sự tạo ra những cái mới. – chobo2

+0

@ chobo2 Tôi không biết rằng mã không thể thay đổi đối tượng được truyền trong đối tượng trong phương thức mở rộng. Tôi đã cập nhật mã. – qujck

+0

Hey, khi tôi sử dụng mã của bạn có vẻ như để thay đổi GUID nhưng nếu bạn chỉ cần thực hiện 3 đối tượng trống và kiểm tra ID họ là tất cả như nhau. – chobo2

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