DataServieException: Oracle, EFOracleProvider, POCO и EF 4.0 - PullRequest
0 голосов
/ 24 июня 2010

Я пытаюсь использовать новые возможности POCO в EF 4.0 в сочетании с EFOracleProvider.Я перекомпилировал EFOracleProvider (используя ODAC вместо System.Data.OracleClient) для целевой .NET Framework 4 (и положил его в 4.0 GAC).Пока все нормально.

Я размещаю Entity Model в службе данных WCF:

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

Мой файл EDMX выглядит следующим образом:

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

Мой класс POCOвыглядит следующим образом:

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; }
 }

и DataContext следующим образом:

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;
  }

Классы POCO и DataContext создаются с помощью шаблона POCO из Visual Studio 2010.

Когда я запускаю службу WCF и хочу опрашивать пользователей, я получаю System.Data.Services.DataServiceException , в котором говорится что-то вроде

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

Когда я смотрю в дубляж,убедитесь, что значения были прочитаны из базы данных (поэтому я думаю, что EFOracleProvider работает нормально) и что DynamicProxies.User _.... получен из моего класса User (который содержит на тот момент данные из базы данных).Итак, вопрос: почему я получаю это исключение?Кто-нибудь знает, что там происходит?Для чего предназначен DynamicProxies.User _.... автоматически создаваемый класс?Исключение выдается в методе GetNonPrimitiveResourceType класса WebUtil .Или, может быть, я что-то упустил из виду?

Любая помощь с благодарностью ....

1 Ответ

1 голос
/ 29 июня 2010

Ссылка от Крейга на пост в блоге http://msdn.microsoft.com/en-us/library/ee705457.aspx раскрыла ответ.Там говорится, что

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

, и это как раз моя проблема.Если я удаляю виртуальный из свойств сгенерированного класса POCO, среда выполнения не генерирует типы прокси, и исключение исчезает.

Еще раз спасибо за ссылку, Крейг.

...