2012-10-03 12 views
8

के साथ इकाई-फ्रेमवर्क 5.0 मैं एक पोस्टग्रेएसक्ल डेटाबेस के साथ ओ/आर मैपर के रूप में एंटिटी-फ्रेमवर्क 5.0 का उपयोग करना चाहता हूं। मैंने पहले से ही कई हाउटो पढ़े हैं लेकिन मैं अभी भी अटक गया हूं। शायद मुझे ईएफ के पीछे पूरा विचार नहीं मिलता है।PostgreSQL

मुझे क्या करना चाहते हैं:

  • मैं अपने खुद के द्वारा कोड लिखना चाहते हैं। फिर वस्तुओं को मैप करने के लिए ईएफ को बताने के लिए गुणों और कक्षाओं में कुछ विशेषताओं को रखें (जैसे मैं एनएचबेर्नेट के साथ करूंगा)।
  • मैं अपने मॉडल से डेटाबेस उत्पन्न नहीं करना चाहता - मैं बस एक मौजूदा का उपयोग करना चाहता हूं।

उदाहरण मॉडल:

[Table("device")] 
public class Device 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(255)] 
    public string Identifier { get; set; } 
} 

[Table("customer")] 
public class Customer 
{ 
    public Customer() 
    { 
     this.Devices = new List<Device>(); 
    } 

    [Key] 
    public int Id { get; set; } 

    [StringLength(255)] 
    public string Name { get; set; } 

    // attribute required? 
    public List<Device> Devices { get; set; } 
} 

क्या मैंने किया:

  • एक DatabaseContext वर्ग
  • जोड़ा गया DbProviderFactories और ConnectionStrings वीं में बनाया गया
  • ऊपर कोड लिखा ई app.config
  • जेनरेट किए गए SSDL, एम एस एल, EdmGen.exe उपकरण के साथ CSDL फ़ाइलों और उन्हें परियोजना में नकल (इन फ़ाइलों को भी बिन फ़ोल्डर में उपलब्ध हैं)

DatabaseContext:

public class DatabaseContext : DbContext 
{ 
    static DatabaseContext() 
    { 
     Database.SetInitializer<DatabaseContext>(null); 
    } 

    public DatabaseContext() 
     : base("PostgreSQL") 
    { 

    } 

    public DbSet<Customer> Customers { get; set; } 
    public DbSet<Device> Devices { get; set; } 
} 

app.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 

    <system.data> 
    <DbProviderFactories> 
     <remove invariant="Npgsql" /> 
     <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql Server" type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> 
    </DbProviderFactories> 
    </system.data> 

    <connectionStrings> 
    <add name="PostGreSQL" 
     providerName="System.Data.EntityClient" 
     connectionString="metadata=.;provider=Npgsql;provider connection string=&quot;Server=asdf;Port=5432;User Id=asdf;Password=asdf;Database=asdf;enlist=true&quot;" /> 
    </connectionStrings> 

</configuration> 

टेस्ट:

using (DatabaseContext context = new DatabaseContext()) 
{ 
    if (context.Database.Exists()) 
    { 
     Console.WriteLine("yep"); 
    } 
    else 
    { 
     Console.WriteLine("nope"); 
    } 

    foreach (Customer c in context.Customers) 
    { 
     Console.WriteLine("Name={0}", c.Name); 
    } 
} 

Console.ReadLine(); 

आउटपुट & त्रुटि:

"हां" .. जो डेटाबेस का मतलब मौजूद हैं। लेकिन जब context.Customers संपत्ति मैं निम्नलिखित अपवाद मिल तक पहुँचने:

The entity type Customer is not part of the model for the current context. 

स्टैकट्रेस: ​​

at System.Data.Entity.Internal.InternalContext.UpdateEntitySetMappingsForType(Type entityType) 
    at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
    at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
    at System.Data.Entity.Internal.Linq.InternalSet`1.GetEnumerator() 
    at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() 
    at EF5.Program.Main(String[] args) in c:\Users\tba\Documents\Visual Studio 2012\Projects\EF5\EF5\Program.cs:line 26 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

मैं क्या समझ में नहीं आता:

  • क्या हैं ssdl, msl, csdl फ़ाइलों के लिए अच्छा है, अगर डेटाअनुक्रम उपलब्ध हैं?
  • ग्राहक वर्ग वर्तमान संदर्भ के लिए मॉडल का हिस्सा क्यों नहीं है?

EdmGen.exe उपकरण का उपयोग करते समय यह ऑब्जेक्टलेयर.cs फ़ाइल भी उत्पन्न करता है जिसमें ऑब्जेक्ट कॉन्टेक्स्ट और इकाई वर्ग होते हैं।इसके साथ समस्या यह है कि इकाई वर्ग EntityObject से प्राप्त होता है। यदि मैं इकाई वर्गों को व्यावसायिक कक्षाओं के रूप में उपयोग करना चाहता हूं तो यह एक गंभीर समस्या है, क्योंकि कक्षाएं किसी भी अन्य वर्ग से प्राप्त नहीं हो सकती हैं।

इसके अलावा मुझे समझ में नहीं आता कि यह ऑब्जेक्ट कॉन्टेक्स्ट क्यों उत्पन्न करता है .. मुझे प्राप्त हर एकल HowTo DbContext क्लास का उपयोग करता है।

इकाई ग्राहक वर्ग EdmGen उपकरण द्वारा उत्पन्न:

/// <summary> 
/// No Metadata Documentation available. 
/// </summary> 
[EdmEntityTypeAttribute(NamespaceName="EF5", Name="Customer")] 
[Serializable()] 
[DataContractAttribute(IsReference=true)] 
public partial class Customer : EntityObject 

मैं कर रहा हूँ उलझन में :-)

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

  • मैं ObjectLayer.cs उपयोग नहीं कर रहा फाइल! और मैं ऊपर वर्णित विरासत समस्याओं के कारण भी इसका उपयोग नहीं करना चाहता हूं। आंशिक ग्राहक वर्ग यह दिखाने के लिए एक उदाहरण है कि एडमोजेन उपकरण क्या उत्पन्न करता है।
  • जब मैं CSDL, एम एस एल और SSDL फ़ाइलें मैं निम्नलिखित त्रुटि मिलती है निकालें:

    At least one SSDL artifact is required for creating StoreItemCollection. 
    
  • जब मैं app.config मैं निम्नलिखित त्रुटि मिलती है में ConnectionString गुण से मेटाडाटा कीवर्ड निकालने:

    Some required information is missing from the connection string. The 'metadata' keyword is always required. 
    



समाधान:

मुझे अंत में पता चला कि यह कैसे काम करता है। App.config में कनेक्शनस्ट्रिंग गलत है। सही connectionstring:

<connectionStrings> 
    <add name="PostgreSQL" 
     connectionString="Server=asdf;Port=5432;User Id=asdf;Password=asdf;Database=asdf;" 
     providerName="Npgsql" /> 
</connectionStrings> 

मैं मेटाडाटा, प्रदाता और connectionstring से प्रदाता कनेक्शन स्ट्रिंग संपत्ति हटा दिया। Brice की तरह, मेटाडाटा फ़ाइलों को जरूरी नहीं है, इसलिए मैंने उन्हें हटा दिया।

डिवाइस और ग्राहक वर्ग के लिए तालिका-विशेषता स्कीमा निर्दिष्ट करने की आवश्यकता है। इस तरह:

[Table("customer", Schema="public")] 
public class Customer 
+1

ऐसा लगता है कि आप मॉडल-प्रथम और कोड प्रथम वर्कफ़्लो मिश्रण करने की कोशिश कर रहे हैं। ईएफ का उपयोग करने के बारे में अधिक जानने के लिए [http://msdn.com/data/ef](http://msdn.microsoft.com/en-us/data/ee712907) पर प्रारंभ करने वाले कुछ वीडियो देखें। – bricelam

+1

एक साधारण उदाहरण बहुत अच्छा होगा। एक प्रोजेक्ट जो PostgreSQL डेटाबेस के साथ EF5 का उपयोग करता है। किसी भी डिजाइनर के बिना, बस कोड (जिम्मेदार कोड)। – bakunin

+2

हो गया: [PostgreSQL पर इकाई फ्रेमवर्क] (http://brice-lambson.blogspot.com/2012/10/entity-framework-on-postgresql.html) – bricelam

उत्तर

4

आपको एसएसडीएल, एमएसएल, सीएसडीएल फाइलें उत्पन्न नहीं करनी चाहिए। इन फ़ाइलों को केवल तभी जरूरी है जब आप डिज़ाइनर का उपयोग करना चाहते हों। इन फ़ाइलों और जेनरेट ऑब्जेक्ट Layer.cs हटाएं।

आपको एंटीटी क्लाइंट कनेक्शन स्ट्रिंग का भी उपयोग नहीं करना चाहिए। बस निम्न होने के लिए अपनी कनेक्शन स्ट्रिंग को अपडेट करें।

<connectionStrings> 
    <add name="PostGreSQL" 
     providerName="Npgsql" 
     connectionString="Server=asdf;Port=5432;User Id=asdf;Password=asdf;Database=asdf;enlist=true" /> 
</connectionStrings> 
+0

मेरी संपादित पोस्ट देखें।मैं ObjectLayer.cs फ़ाइल का उपयोग नहीं करता हूं। – bakunin

+0

मेरा जवाब अपडेट किया गया। ऐसा लगता है कि आपकी समस्या बस कनेक्शन स्ट्रिंग है। – bricelam

+0

दोह, ऐसा लगता है कि आप इसे काम कर रहे हैं। :) बहुत बढ़िया – bricelam