2013-02-23 5 views
5

मैं ईएफ 5 और .NET 4.5 का उपयोग कर रहा हूं। मेरे पास एक विशेष वर्ग है जिसे डेटाबेस में गलत तरीके से उत्पन्न किया जा रहा है। हालांकि यह मेरी वेबसाइट में कुछ और जटिल है, मैं सरल बनाउंगा;ef 5 codefirst enum संग्रह डेटाबेस में उत्पन्न नहीं किया गया

namespace Store.Enities 
{ 
    public enum Role 
    { Manager, Clerk } 

    public class User 
    { 
     public int Id {get; set;} 
     public ICollection<Role> Roles {get; set;} 
    } 

    public class StoreContext : DbContext 
    { 
     public DbSet<User> Users {get; set;} 

     public StoreContext() 
     { 
      Database.SetIntializer(new DropCreateDatabaseIfModelChanges<StoreContext>()); 
     } 
    } 
} 

जैसा कि आप देख सकते हैं कि उपयोगकर्ता में एक से अधिक भूमिका हो सकती है। किसी कारण से मैं डेटाबेस में भूमिकाओं को स्टोर करने का प्रबंधन नहीं कर सकता।

उत्तर

6

मैं अभी भी विंडोज एक्सपी एसपी 3 चला रहा हूं इसलिए मैं .NET Framework 4.5 स्थापित नहीं कर सकता और मैं यह देखने के लिए परीक्षण नहीं चला सकता कि क्या गलत है लेकिन मैं अनुमान लगा सकता हूं। आपके डिज़ाइन में प्रत्येक "उपयोगकर्ता" में शून्य से कई "भूमिकाएं" हो सकती हैं, अब सम्मेलन द्वारा इकाई फ्रेमवर्क "उपयोगकर्ताओं" को संदर्भित करने के लिए "भूमिकाएं" पर एक विदेशी कुंजी उत्पन्न करेगा, लेकिन चूंकि "भूमिका" एक गणना है जो एक जटिल वस्तु है (वैल्यू ऑब्जेक्ट) इकाई ढांचा इस स्थिति का समर्थन नहीं करता है, "इकाई फ्रेमवर्क एक इकाई प्रकार पर एक जटिल प्रकार का संग्रह रखने का समर्थन नहीं करता है", आपको एक इकाई भूमिका निभाने और उसे एक आईडी देने की आवश्यकता है। बस यह सुनिश्चित करने के लिए कि मैं एक-दूसरे से संबंध बनाने का सही प्रयास करता हूं (प्रत्येक उपयोगकर्ता की केवल एक भूमिका होती है) और यदि यह काम करता है तो मैं सही हूं।

10

एक enum अभी भी एक प्राचीन प्रकार है, विशेष रूप से एक पूर्णांक। जैसे आपकी User कक्षा में ICollection<int> नहीं हो सकता है जो डेटाबेस में कुछ के लिए मानचित्र करता है, इसमें enum का संग्रह नहीं हो सकता है। (या कुछ भी लेकिन Role)

public class Role 
{ 
    public int Id {get; set;} 
    public Roles Role {get; set;} 
} 

और Roles में enum का नाम बदलने:

आप एक Role वर्ग कि ऐसा दिखाई दे सकता परिभाषित करना चाहिए।

0

गर्ट Amold द्वारा जवाब आप अंतर्निहित ऑपरेटर का उपयोग करके एक अच्छा आवरण वर्ग बना सकते हैं के आधार पर:

public class RoleWrapper 
{ 
    public int Id { get; set; } 

    // Role is any Enum 
    public Role Role { get; set; } 

    public static implicit operator Role(RoleWrapper val) 
    { 
     return val.Role; 
    } 
    public static implicit operator RoleWrapper(Role val) 
    { 
     return new RoleWrapper() { Role = val }; 
    } 
} 

इस तरह आप primitiv Enum प्रकार भूमिका के साथ संग्रह का उपयोग कर सकते हैं:

myUser.Roles.Add(Role.WhateverRole); 
Role firstRole = myUser.Roles[0]; 
संबंधित मुद्दे