2010-06-24 17 views
0

J'essaie d'utiliser les nouvelles fonctionnalités POCO de EF 4.0 en combinaison avec EFOracleProvider. J'ai recompilé le EFOracleProvider (en utilisant ODAC au lieu de System.Data.OracleClient) pour cibler le .NET Framework 4 (et le mettre dans le 4.0 GAC). Tout va bien jusqu'ici.DataServieException: Oracle, EFOracleProvider, POCO et EF 4.0

je serai l'hôte du modèle d'entité dans un service de données WCF:

class DivaDispoDataService : DataService<DivaDispoContainer> 
{ 
    public static void InitializeService(IDataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("*", EntitySetRights.All); 
     config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); 
    } 
} 

fichier Mon EDMX ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx"> 
    <!-- EF Runtime content --> 
    <edmx:Runtime> 
    <!-- SSDL content --> 
    <edmx:StorageModels> 
     <Schema xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="DivaDispo.Store" Alias="Self" Provider="EFOracleProvider" ProviderManifestToken="10g"> 
     <EntityContainer Name="DivaDispoStoreContainer"> 
      <EntitySet Name="DIW_USER" EntityType="DivaDispo.Store.DIW_USER" store:Type="Tables" Schema="" /> 
     </EntityContainer> 
     <EntityType Name="DIW_USER"> 
      <Key> 
      <PropertyRef Name="IDX" /> 
      </Key> 
      <Property Name="IDX" Type="number" Nullable="false" Precision="10" /> 
      <Property Name="USERNAME" Type="number" Precision="10" /> 
      <Property Name="PERSONNELNUMBER" Type="number" Precision="10" /> 
      <Property Name="PASSWORD" Type="varchar2" MaxLength="10" /> 
      <Property Name="ACTIVATED" Type="number" Precision="1" /> 
      <Property Name="ROLE" Type="number" Precision="1" /> 
     </EntityType> 
     </Schema> 
    </edmx:StorageModels> 
    <!-- CSDL content --> 
    <edmx:ConceptualModels> 
     <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" Namespace="DivaDispo.Model" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"> 
     <EntityContainer Name="DivaDispoContainer" annotation:LazyLoadingEnabled="false"> 
      <EntitySet Name="User" EntityType="DivaDispo.Model.User" /> 
     </EntityContainer> 
     <EntityType Name="User"> 
      <Key> 
      <PropertyRef Name="ID" /> 
      </Key> 
      <Property Name="ID" Type="Decimal" Nullable="false" Precision="10" Scale="0" /> 
      <Property Name="Username" Type="Decimal" Precision="10" Scale="0" /> 
      <Property Name="PersonnelNumber" Type="Decimal" Precision="10" Scale="0" /> 
      <Property Name="Password" Type="String" MaxLength="10" Unicode="false" FixedLength="false" /> 
      <Property Name="Activated" Type="Boolean" /> 
      <Property Name="Role" Type="Boolean" /> 
     </EntityType> 
     </Schema> 
    </edmx:ConceptualModels> 
    <!-- C-S mapping content --> 
    <edmx:Mappings> 
     <Mapping xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs" Space="C-S"> 
     <EntityContainerMapping StorageEntityContainer="DivaDispoStoreContainer" CdmEntityContainer="DivaDispoContainer"> 
      <EntitySetMapping Name="User"> 
      <EntityTypeMapping TypeName="IsTypeOf(DivaDispo.Model.User)"> 
       <MappingFragment StoreEntitySet="DIW_USER"> 
       <ScalarProperty Name="ID" ColumnName="IDX" /> 
       <ScalarProperty Name="Username" ColumnName="USERNAME" /> 
       <ScalarProperty Name="PersonnelNumber" ColumnName="PERSONNELNUMBER" /> 
       <ScalarProperty Name="Password" ColumnName="PASSWORD" /> 
       <ScalarProperty Name="Activated" ColumnName="ACTIVATED" /> 
       <ScalarProperty Name="Role" ColumnName="ROLE" /> 
       </MappingFragment> 
      </EntityTypeMapping> 
      </EntitySetMapping> 
     </EntityContainerMapping> 
     </Mapping> 
    </edmx:Mappings> 
    </edmx:Runtime> 
</edmx:Edmx> 

Mon POCO classe ressemble à ceci:

public partial class User 
{ 
    public virtual decimal ID { get; set; } 
    public virtual Nullable<decimal> Username { get; set; } 
    public virtual Nullable<decimal> PersonnelNumber { get; set; } 
    public virtual string Password { get; set; } 
    public virtual Nullable<bool> Activated { get; set; } 
    public virtual Nullable<bool> Role { get; set; } 
} 

et le DataContext comme ceci:

public partial class DivaDispoContainer : ObjectContext 
{ 
    public const string ConnectionString = "name=DivaDispoContainer"; 
    public const string ContainerName = "DivaDispoContainer"; 

    #region Constructors 

    public DivaDispoContainer() 
     : base(ConnectionString, ContainerName) 
    { 
     this.ContextOptions.LazyLoadingEnabled = false; 
    } 

    public DivaDispoContainer(string connectionString) 
     : base(connectionString, ContainerName) 
    { 
     this.ContextOptions.LazyLoadingEnabled = false; 
    } 

    public DivaDispoContainer(EntityConnection connection) 
     : base(connection, ContainerName) 
    { 
     this.ContextOptions.LazyLoadingEnabled = false; 
    } 

    #endregion 

    #region ObjectSet Properties 

    public ObjectSet<User> User 
    { 
     get { return _user ?? (_user = CreateObjectSet<User>("User")); } 
    } 
    private ObjectSet<User> _user; 
    } 

Les classes POCO et DataContext sont générés avec le modèle POCO à partir de Visual Studio 2010.

Quand je commence mon service WCF et que vous souhaitez interroger les utilisateurs que je reçois un System.Data.Services.DataServiceException qui Says somtihng comme

500: Internal Server error. The type 'System.Data.Entity.DynamicProxies.User_057822846B2B8DD7BB03058490B27D19E6C634EACF33438FE886 19C8BBB1CF74' is not a komplex type or entity type. 

Quand je regarde dans le dubgger je peux voir que les valeurs ont été lues à partir de la base de données (donc je pense que le EFOracleProvider fonctionne bien) et que le DynamicProxies.User _.... est derrived de ma classe User (qui contient à ce moment les données de la base de données). Donc la question est: Pourquoi est-ce que je reçois cette exception? Est-ce que quelqu'un sait ce qui se passe là-bas? Quelle est la classe générée par DynamicProxies.User _.... automaic? L'exception est générée dans la méthode GetNonPrimitiveResourceType de la classe WebUtil. Ou peut-être que j'ai quelque chose oublié?

Toute aide grandement appréciée ....

+0

Est-ce que quelqu'un a réussi à utiliser le EFOracleProvider de Microsoft avec EF4 et POCO? Je suis vraiment coincé ici ... – Jeldrik

+0

Microsoft ne maintient plus EFOracleProvider. Je ne m'attendrais pas à ce qu'il fonctionne bien avec de nouvelles fonctionnalités. Essayez le fournisseur Devart ou attendez le fournisseur Oracle à la fin de l'année. http://www.oracle.com/technology/tech/dotnet/col/ef/oracle_entity_framework_sod.pdf –

+0

Le proxy est une méthode de suivi des modifications pour les entités. Les entités d'auto-suivi peuvent être un meilleur choix pour les services de données. Voir http://blogs.msdn.com/b/adonet/archive/2009/06/22/feature-ctp-walkthrough-self-tracking-entities-for-entity-framework.aspx et http://msdn.microsoft .com/fr-fr/library/ee705457.aspx et http://blogs.msdn.com/b/adonet/archive/2009/05/21/poco-in-the-entity-framework-part-1-the -experience.aspx –

Répondre

1

Le lien de Craig au poste blog http://msdn.microsoft.com/en-us/library/ee705457.aspx a révélé la réponse. Il y est dit que

The POCO proxy type cannot be directly serialized or deserialized by WCF 

et c'est exactement mon problème. Si je supprime le virtuel des propriétés de la classe POCO générative, le runtime ne génère pas les types de proxy et l'exception disparaît.

Merci encore pour le lien, Craig.