2012-11-29 3 views
7

Próbuję skonfigurować bardzo prosty projekt testowy do oceny możliwości Mono Entity Framework. Podczas próby uzyskania dostępu do danych pojawia się wyjątek środowiska wykonawczego podczas analizowania danych modelu podczas korzystania z .NET Runtime. Podczas korzystania z środowiska wykonawczego Mono generowany jest wyjątek stackoverflow.Jak skonfigurować Entity Framework/SQL Server z Mono

To wydaje się być wewnętrznym monobusem, który występuje podczas kompilowania schematu CSDL w wersji 3 - patrz Mono Bugtracker.

Więc moje pytanie brzmi:

Jak Setup mono z Entity Framework do pracy z Microsoft SQL Server? Skoro nie znajduję zbyt wielu informacji, czy byłoby to możliwe? Czy ktokolwiek z was z powodzeniem skonfigurował mono z wykorzystaniem EF i napotkał podobne błędy?

To, co zrobiłem do tej pory:

  • zainstalowana Mono 3.0.1 Beta (najnowsza stabilna nie obejmuje EntityFramework.dll)
  • skonfigurować Mono Profile dla Visual Studio
  • Disabled strong name verification for delay signed assembilies dla EntityFramework.dll/EntityFramework.SQLServer.dll i dodano je do GAC, aby zapobiec błędom wykonawczym
  • Utworzono prosty model + dodano elementy generowania kodu
  • napisany kod przy użyciu modelu

Kod współpracuje z Microsoft EntityFramework.dll (wersja 6 Wersji Wstępnej). Podczas korzystania równowartość Mono, wygląda na to są problemy podczas parsowania modelu jednostki:

wiadomość Exception (.NET Runtime):

Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

StackTrace (NET wykonania):

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() 

wiadomość wyjątek (mono wykonania):

Żądane działanie spowodowane przepełnienie stosu.

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 
... 

Jest to kod używam:

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

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

EDMX plik

<?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> 

I wreszcie ciąg połączenia Używam:

<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

Czy wypróbowałeś Mono 2.11.3 lub nowszy? –

+0

Wypróbowałem to z Mono 3.0.1 Beta od http://www.go-mono.com/mono-downloads/download.html - jest już nowa wersja (3.0.2), spróbuję jeszcze raz z tą wersją i opublikuj moje wyniki. – Dresel

+0

Identyczne błędy podczas używania 3.0.2 ... – Dresel

Odpowiedz

5

Dresel, jak mylące mojej reputacji może być na tej stronie, mogę śmiało powiedzieć, że za pomocą EntityFramework z mono nie jest zalecane podejście w tym czasie. Chociaż jest technicznie "obsługiwany", większość biblioteki w najlepszym przypadku nie działa. Po spędzeniu około miesiąca kopania na tyle, na ile mogłem, nie byłem w stanie wykluczyć możliwości stworzenia w pełni funkcjonującej strony powyżej% 20. Zamiast tego użyłem NHibernate i byłem zachwycony wynikami. I zaleca się robić to samo, aż baza zestali się dalej dla projektu EF Mono. Nhibernate Example (using MySQL, MSSQL supported)

Mam nadzieję, że to pomoże choć trochę, bo to tylko moja szczera myśl. Życzę powodzenia w tym, co zrobisz, Wiem, że ruch MS Opensource może być bardzo "roadblocky".

+0

Po prostu ciekawy - kiedy mówisz "biblioteka niefunkcjonalna", czy mówisz o najnowszych wersjach mono (3.x)? –

+0

Dla mojego zespołu i dla mnie z systemem Ubuntu i wszystkimi najnowszymi programami od końca grudnia. Są to biblioteki kompilujące się w oknach, ale niektóre rzeczy, które były potrzebne, nie były w tym czasie obsługiwane. – Chazt3n

+0

ok, wielkie dzięki. –