2011-03-11 4 views
11

यह सवाल, एक साल पहले पूछा, समान है: Does the Entity Framework 4 support generators for id values like NHibernate?क्या इकाई फ्रेमवर्क 4 कोड पहले एनएचबीर्नेट जैसे पहचान जनरेटर के लिए समर्थन है?

लेकिन क्या मुझे पता करना चाहते हैं तो कोड पहले CTP पहचान पीढ़ी रणनीतियों के लिए समर्थन जोड़ता है। यदि नहीं, तो क्या किसी को समान कुछ लागू करने के लिए ईएफ में एक अच्छा विस्तार बिंदु पता है?

मैं वर्तमान में मॉडल कक्षाओं के साथ काम कर रहा हूं जो पहचानकर्ता के रूप में GUID का उपयोग करते हैं। ईएफ का उपयोग करते समय वे अपने Guid.Empty प्रारंभिक मानों को बनाए रखते हैं। मुझे पता है कि आप डीबी में कॉलम के लिए newid() पर डिफ़ॉल्ट मान सेट कर सकते हैं लेकिन यह क्लाइंट-साइड पहचान पीढ़ी के उद्देश्य को हरा देता है।

क्या इकाई फ्रेमवर्क सिर्फ वितरित, डिस्कनेक्ट सिस्टम में उपयोग करने के लिए पर्याप्त परिपक्व नहीं है?

+0

अच्छा सवाल .. –

+4

EntityFramework 4.0 1.0 से एक बड़ा कदम आगे है, लेकिन यह अभी भी एक और आधे पके हुए Microsoft क्रियान्वयन है। एक्स्टेंसिबिलिटी कुछ को कुछ नहीं बताती है। – Jeff

+1

@ जेफ, जबकि मैं आपकी राय की सराहना करता हूं (मेरा समान है, मैं एनएच पसंद करता हूं), इस विशेष परियोजना के लिए मेरे पास कुछ और उपयोग करने के लिए छूट नहीं है। – joshperry

उत्तर

16

नहीं, इकाई फ्रेमवर्क कोड-पहले अभी भी EFv4 के आसपास बस अच्छा रैपर है। जेनरेटर की तरह कोई एनएचबीरनेट नहीं है। यदि आप क्लाइंट साइड आईडी जनरेटर चाहते हैं तो आपको SaveChanges व्युत्पन्न DbContext में ओवरराइड करना होगा और नई संस्थाओं को आईडी निर्दिष्ट करने का अपना तर्क लागू करना होगा।

संपादित करें:

कुछ उच्च स्तर के उदाहरण:

public class Context : DbContext 
{ 
    // Helper for example 
    // DO NOT USE IN REAL SCENARIOS!!! 
    private static int i = 0; 

    public DbSet<MyEntity> MyEntities { get; private set; } 

    public Context() 
     : base("connection") 
    { 
     MyEntities = Set<MyEntity>(); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<MyEntity>().HasKey(e => e.Id); 
     // Turn off autogeneration in database 
     modelBuilder.Entity<MyEntity>() 
        .Property(e => e.Id) 
        .HasDatabaseGeneratedOption(HasDatabaseGeneratedOption.None); 

     // Other mapping 
    } 

    public override int SaveChanges() 
    { 
     foreach (var entry in ChangeTracker.Entries<MyEntity>() 
      .Where(e => e.State == EntityState.Added)) 
     { 
      // Here you have to add some logic to generate Id 
      // I'm using just static field 
      entry.Entity.Id = ++i; 
     } 

     return base.SaveChanges(); 
    } 
} 

public class MyEntity 
{ 
    public int Id { get; set; } 
    // Other properties 
} 
+3

... जो कोड की कुछ पंक्तियां, शीर्ष होगा। –

+0

बिल्कुल सही (एक कामकाज के लिए), धन्यवाद Ladislav। – joshperry

+0

दिलचस्प लगता है, इसे कैसे कार्यान्वित किया जाए इस पर कोई संकेतक? (नई संस्थाओं को कैसे प्राप्त करें, आईडी को असाइन करने से ईएफ को कैसे रोकें, आदि) –

6

सं

खान इकाई की रूपरेखा 4.1.10715 NuGet द्वारा स्थापित। here: हो सकता है आप का श्रेय

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int Id {get;set;} 

कृपया (पेज में CTRL + F एफई 4.1 में समर्थित एनोटेशन की पूरी सूची देखें) इस्तेमाल कर सकते हैं।

-1
[Key] 
public string Id { get; set; } 

और फिर नए GUID ToString का उपयोग

Units.Add(new Unit(){Id=Guid.NewGuid().ToString(), Name="123"});