2013-04-30 17 views
9

Ich komme aus einem Nhibernate-Hintergrund und ich frage mich, wie kann ich die Guid automatisch auf der Serer-Seite generieren und keine Runde machen, um es auf der Datenbankseite zu machen?Guid auf Serverside Entity Framework 5 generieren?

In fließend nhibernate es ist einfach nur

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

Antwort

15

Wenn Sie den Schlüssel auf dem Server erstellen möchten, tun dies einfach in Code:

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

Wenn Sie die Datenbank wollen, dass die erzeugen Taste, dann verwenden Sie das Attribut DatabaseGenerated:

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

Wenn Sie nach der Verwendung von sequ sind GUIDs, dann gibt es im Moment keine einfache Antwort. Einige Beispiele, die Sie entlang dem richtigen Weg bekommen:

+0

In Nhibernate haben sie GuidComb was angeblich besser ist. Macht es nichts mit EF? Irgendein Vorteil zwischen den 2 Möglichkeiten in EF. In Nhibernate empfehlen sie nicht, db zu erzeugen. – chobo2

+0

Ah, war mir nicht bewusst, die COMB Unterschied. Die Antwort wurde mit weiteren Optionen aktualisiert. – Richard

+2

Hinweis: Wenn Sie aus ** edmx ** generieren, vergewissern Sie sich, dass die ** Generierte Spalte ** ** für die Spalte, für die die GUID servergeneriert werden soll, auf ** Identität ** eingestellt ist. –

1

Dieser Code tut, was Sie brauchen:

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; 
    } 
} 

-Test Klasse:

public class TestObject 
{ 
    public TestObject() 
    { 
    } 

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

Prüfregeln:

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 nicht folgen. Ich mache ein Forloop mit einer nullbaren GUID und übertrage es in die Guidcomb-Methode, und es erzeugt die gleiche Guid. Also nicht sicher, ob tatsächlich neue generiert werden. – chobo2

+0

@ chobo2 Ich wusste nicht, dass der Code das übergebene Objekt innerhalb der Erweiterungsmethode nicht ändern kann. Ich habe den Code aktualisiert. – qujck

+0

Hey, wenn ich Ihren Code benutze, scheint es, die GUID zu ändern, aber wenn Sie nur 3 leere Objekte machen und die ID überprüfen, sind sie alle gleich. – chobo2

Verwandte Themen