2012-11-29 15 views
7

Sto provando a impostare un progetto di test molto semplice per valutare le funzionalità di Mono Entity Framework. Quando provo ad accedere ai dati, ottengo un'eccezione di runtime sull'analisi dei dati del modello quando si utilizza .NET Runtime. Quando si utilizza Mono runtime, viene generata un'eccezione StackOverflow.Come configurare Entity Framework/SQL Server con Mono

Questo sembra essere un bug interno mono che si verifica durante la compilazione dello schema CSDL versione 3 - vedere Mono Bugtracker.

Quindi la mia domanda è:

Come faccio configurazione mono con Entity Framework di lavorare con un Microsoft SQL Server? Dal momento che non trovo molte informazioni, dovrebbe essere possibile? Qualcuno di voi ha configurato con successo una soluzione mono usando EF e ha riscontrato errori simili?

Questo è quello che ho fatto finora:

  • installata Mono 3.0.1 Beta (ultima versione stabile non include EntityFramework.dll)
  • Impostare un Mono Profile per Visual Studio
  • Disabled strong name verification for delay signed assembilies per EntityFramework.dll/EntityFramework.SQLServer.dll e li ha aggiunti al GAC per evitare errori di runtime
  • Creato un modello semplice + elementi di generazione codice aggiunti
  • codice scritto utilizzando il modello

Il codice funziona con Microsoft EntityFramework.dll (Versione 6, Prerelease). Quando si utilizza l'equivalente Mono, sembra che non ci sono problemi durante l'analisi del modello di entità:

Messaggio di eccezione (NET Runtime):

riferimento oggetto non impostato a un'istanza di un oggetto.

Stacktrace (NET Runtime):

at System.Xml.XmlTextReaderImpl.InitStreamInput(Uri baseUri, String baseUriStr, Stream stream, Byte[] bytes, Int32 byteCount, Encoding encoding) 
    at System.Xml.XmlTextReaderImpl..ctor(String url, Stream input, XmlNameTable nt) 
    at System.Xml.XmlTextReader..ctor(Stream input) 
    at System.Data.Entity.Core.EntityModel.SchemaObjectModel.Schema.SomSchemaSetHelper.AddXmlSchemaToSet(XmlSchemaSet schemaSet, XmlSchemaResource schemaResource, HashSet`1 schemasAlreadyAdded) 
    at System.Data.Entity.Core.EntityModel.SchemaObjectModel.Schema.SomSchemaSetHelper.AddXmlSchemaToSet(XmlSchemaSet schemaSet, XmlSchemaResource schemaResource, HashSet`1 schemasAlreadyAdded) 
    at System.Data.Entity.Core.EntityModel.SchemaObjectModel.Schema.SomSchemaSetHelper.ComputeSchemaSet(SchemaDataModelOption dataModel) 
    at System.Data.Entity.Core.Common.Utils.Memoizer`2.Result.GetValue() 
    at System.Data.Entity.Core.Common.Utils.Memoizer`2.Evaluate(TArg arg) 
    at System.Data.Entity.Core.EntityModel.SchemaObjectModel.Schema.SomSchemaSetHelper.GetSchemaSet(SchemaDataModelOption dataModel) 
    at System.Data.Entity.Core.EntityModel.SchemaObjectModel.Schema.Parse(XmlReader sourceReader, String sourceLocation) 
    at System.Data.Entity.Core.EntityModel.SchemaObjectModel.SchemaManager.ParseAndValidate(IEnumerable`1 xmlReaders, IEnumerable`1 sourceFilePaths, SchemaDataModelOption dataModel, AttributeValueNotification providerNotification, AttributeValueNotification providerManifestTokenNotification, ProviderManifestNeeded providerManifestNeeded, IList`1& schemaCollection) 
    at System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Loader.LoadItems(IEnumerable`1 xmlReaders, IEnumerable`1 sourceFilePaths) 
    at System.Data.Entity.Core.Metadata.Edm.StoreItemCollection.Init(IEnumerable`1 xmlReaders, IEnumerable`1 filePaths, Boolean throwOnError, DbProviderManifest& providerManifest, DbProviderFactory& providerFactory, String& providerManifestToken, Memoizer`2& cachedCTypeFunction) 
    at System.Data.Entity.Core.Metadata.Edm.StoreItemCollection..ctor(IEnumerable`1 xmlReaders, IEnumerable`1 filePaths) 
    at System.Data.Entity.Core.Metadata.Edm.MetadataCache.StoreMetadataEntry.LoadStoreCollection(EdmItemCollection edmItemCollection, MetadataArtifactLoader loader) 
    at System.Data.Entity.Core.Metadata.Edm.MetadataCache.LoadItemCollection[T](IItemCollectionLoader`1 itemCollectionLoader, T entry) 
    at System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetOrCreateStoreAndMappingItemCollections(String cacheKey, MetadataArtifactLoader loader, EdmItemCollection edmItemCollection, Object& entryToken) 
    at System.Data.Entity.Core.EntityClient.EntityConnection.LoadStoreItemCollections(MetadataWorkspace workspace, DbConnection storeConnection, DbConnectionOptions connectionOptions, EdmItemCollection edmItemCollection, MetadataArtifactLoader artifactLoader) 
    at System.Data.Entity.Core.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) 
    at System.Data.Entity.Core.EntityClient.EntityConnection.InitializeMetadata(DbConnection newConnection, DbConnection originalConnection, Boolean closeOriginalConnectionOnFailure) 
    at System.Data.Entity.Core.EntityClient.EntityConnection.Open() 
    at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection() 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Entity.Core.Objects.ObjectQuery`1.<GetEnumerator>m__2C3() 
    at System.Lazy`1.CreateValue() 
    at System.Lazy`1.LazyInitValue() 
    at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() 
    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) 
    at System.Linq.Queryable.Count[TSource](IQueryable`1 source) 
    at EntityFrameworkMono.Program.Main(String[] args) in c:\Users\Christopher Dresel\Documents\Visual Studio 2012\Projects\New\EntityFrameworkMono\EntityFrameworkMono\Program.cs:line 17 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    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() 

Messaggio di eccezione (Mono Runtime):

L'operazione richiesta ha causato un overflow dello stack.

Stacktrace (Mono Runtime):

at System.Xml.Schema.XmlSchemaGroupBase.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
    at System.Xml.Schema.XmlSchemaGroupBase.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
    at System.Xml.Schema.XmlSchemaElement.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
    at System.Xml.Schema.XmlSchemaGroupBase.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
    at System.Xml.Schema.XmlSchemaGroupBase.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
    at System.Xml.Schema.XmlSchemaElement.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
    at System.Xml.Schema.XmlSchemaGroupBase.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
    at System.Xml.Schema.XmlSchemaGroupBase.CheckRecursion (Int32 depth, System.Xml.Schema.ValidationEventHandler h, System.Xml.Schema.XmlSchema schema) [0x00000] in <filename unknown>:0 
... 

Questo è il codice che sto utilizzando:

CustomerEntities entities = new CustomerEntities(); 
var count = entities.Customers.Count(); // Exception throws here 

Console.WriteLine(count); 
Console.ReadKey(); 

EDMX file di

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx"> 
    <!-- EF Runtime content --> 
    <edmx:Runtime> 
     <!-- SSDL content --> 
     <edmx:StorageModels> 
      <Schema Namespace="CustomerModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl"> 
       <EntityContainer Name="CustomerModelStoreContainer"> 
        <EntitySet Name="Customer" EntityType="CustomerModel.Store.Customer" store:Type="Tables" Schema="dbo" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" /> 
       </EntityContainer> 
       <EntityType Name="Customer"> 
        <Key> 
         <PropertyRef Name="CustomerID" /> 
        </Key> 
        <Property Name="CustomerID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> 
        <Property Name="CustomerName" Type="nvarchar" Nullable="false" MaxLength="50" /> 
       </EntityType> 
      </Schema> 
     </edmx:StorageModels> 
     <!-- CSDL content --> 
     <edmx:ConceptualModels> 
      <Schema Namespace="CustomerModel" Alias="Self" annotation:UseStrongSpatialTypes="false" xmlns="http://schemas.microsoft.com/ado/2009/11/edm" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"> 
       <EntityContainer Name="CustomerEntities" annotation:LazyLoadingEnabled="true"> 
        <EntitySet Name="Customers" EntityType="CustomerModel.Customer" /> 
       </EntityContainer> 
       <EntityType Name="Customer"> 
        <Key> 
         <PropertyRef Name="CustomerID" /> 
        </Key> 
        <Property Name="CustomerID" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> 
        <Property Name="CustomerName" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" /> 
       </EntityType> 
      </Schema> 
     </edmx:ConceptualModels> 
     <!-- C-S mapping content --> 
     <edmx:Mappings> 
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2009/11/mapping/cs"> 
       <EntityContainerMapping StorageEntityContainer="CustomerModelStoreContainer" CdmEntityContainer="CustomerEntities"> 
        <EntitySetMapping Name="Customers"> 
         <EntityTypeMapping TypeName="CustomerModel.Customer"> 
          <MappingFragment StoreEntitySet="Customer"> 
           <ScalarProperty Name="CustomerID" ColumnName="CustomerID" /> 
           <ScalarProperty Name="CustomerName" ColumnName="CustomerName" /> 
          </MappingFragment> 
         </EntityTypeMapping> 
        </EntitySetMapping> 
       </EntityContainerMapping> 
      </Mapping> 
     </edmx:Mappings> 
    </edmx:Runtime> 
</edmx:Edmx> 

E, infine, la stringa di connessione Sto usando:

<connectionStrings> 
    <add name="CustomerEntities" 
     connectionString="metadata=.\CustomerModel.csdl|.\CustomerModel.ssdl|.\CustomerModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=CHRISTOPHERPC\SQLExpress;initial catalog=test;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 
     providerName="System.Data.EntityClient"/> 
</connectionStrings> 
+0

Hai provato Mono 2.11.3 o più recente? –

+0

L'ho provato con Mono 3.0.1 Beta da http://www.go-mono.com/mono-downloads/download.html - c'è una nuova versione in uscita (3.0.2), ci riproverò con questa versione e pubblica i miei risultati. – Dresel

+0

Stessi errori quando si usa 3.0.2 ... – Dresel

risposta

5

Dresel, fuorviante, in quanto la mia reputazione possono essere su questo sito, posso tranquillamente dire che utilizzando l'EntityFramework con mono non è l'approccio raccomandato in questo momento. Sebbene sia tecnicamente "supportato", la maggior parte della libreria non è funzionale al meglio. Dopo aver trascorso circa un mese a scavare per quanto potevo, non ero in grado di aggirare la possibilità di realizzare un sito completamente funzionante sopra il 20%. Ho usato invece NHibernate e sono stato elettrizzato dai risultati. E consigliamo di fare lo stesso fino a quando la base si sarà solidificata ulteriormente per il progetto EF Mono. Nhibernate Example (using MySQL, MSSQL supported)

Spero che questo aiuti almeno un po 'perché è solo il mio pensiero sincero. Buona fortuna per qualsiasi cosa tu scelga di fare, so che questa mossa MS Opensource può diventare molto "roadblock"

+0

solo curioso - quando dici "libreria non funzionale", stai parlando delle ultime versioni mono (3.x)? –

+0

Per il mio team e per me che eseguo Ubuntu e tutti i software più recenti a partire dalla fine di dicembre. Le librerie sono compilate in Windows, ma alcune cose che erano necessarie non erano supportate in quel momento. – Chazt3n

+0

ok, grazie molte. –

Problemi correlati