WCF OData Service und EF 6 Problem - Entitäten können mit Odata Service nicht verfügbar gemacht werden

Ich verwende den WCF-Datendienst (Odata) mit .NET Framework 4.5.1 und EF 6.1. Ich habe Code First Approach verwendet, um ein EF-Modell zu erstellen. Wenn ich dieses EF-Modell (AddProjectModel.cs) auf den WCF-OData-Dienst (WcfDataService1.svc) verweise, wird der folgende Fehler ausgegeben:

Error

Der Server hat bei der Verarbeitung der Anforderung einen Fehler festgestellt. Die Ausnahmemeldung lautet 'Beim Datenkontexttyp' AddProjectModel 'gibt es eine Top-IQueryable-Eigenschaft' Assets ', deren Elementtyp kein Entitätstyp ist. Stellen Sie sicher, dass die IQueryable-Eigenschaft vom Entitätstyp ist, oder geben Sie das IgnoreProperties-Attribut für den Datenkontexttyp an, um diese Eigenschaft zu ignorieren. ' Weitere Informationen finden Sie in den Serverprotokollen. Der Ausnahmestapel-Trace lautet:

at System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata (ProviderMetadataCacheItem metadataCacheItem) at System.Data.Services.Providers.BaseServiceProvider.LoadMetadata (Boolean skipServiceOperations) at System.Data.Services.DataServiceOperatio1.CreateInternalProvider(Object dataSourceInstance) at System.Data.Services.DataService 1.CreateMetadataAndQueryProvider (IDataServiceMetadataProvider & MetadataProviderInstance, IDataServiceQueryProvider & queryProviderInstance, Object & dataSourceInstance, Boolean & isInternallyCreatedProvider) bei System.Data.Services.DataService1.CreateProvider() at System.Data.Services.DataService 1.HandleRequest () bei System.Data.Services.DataService`1.ProcessRequestForMessage (Stream messageBody) bei SyncInvokeProcessRequestForMessage (Object, Object [], Object []) bei System.ServiceModel.Dispatcher.SyncMethodInvoker Object.Invoke ( [] Eingaben, Objekt [] & Ausgaben) bei System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & rpc) bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc & rpc) bei System.ServiceModel.Dispatcher rpc) bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & rpc) bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & rpc) bei System.ServiceModel.DispatcherMessocessRcable & rp3 .ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & rpc) bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & rpc) bei System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & rpc) bei System.ServiceModel.Dispatcher.MessageRpc.Process (Boolean isOperationContextSet)

Hier ist mein WCF-Datendienst: WcfDataService1.svc

namespace AddProjectService
{
 public class WcfDataService1 : DataService<AddProjectModel>
 {
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        // TODO: set rules to indicate which entity sets and service operations are visible,
         updatable, etc.
        // Examples:
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
    }
 }
}

Mein Code Erstes Modell: AddProjectModel.cs

 public partial class AddProjectModel : DbContext
 {
  public AddProjectModel()
    : base("name=AddProjectModel")
  {
  }

  public virtual DbSet<Asset> Assets { get; set; }
  public virtual DbSet<Project> Projects { get; set; }

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Configurations.Add(new AssetMap());
    modelBuilder.Configurations.Add(new ProjectMap());   
  }         
 }  

 public class AssetMap : EntityTypeConfiguration<Asset>
 {
  public AssetMap()
  {
  this.Property(a => a.AssetId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);      
  this.HasMany(a => a.Projects).WithRequired(p => p.Asset).HasForeignKey(p => p.AssetId);

  //table  & column mappings
  this.ToTable("TBLASSET");
  this.Property(a => a.AssetId).HasColumnName("ASSETID");
  this.Property(a => a.AssetLevelId).HasColumnName("ASSETLEVELID");
  this.Property(a => a.AssetNumber).HasColumnName("ASSETNUMBER");
  this.Property(a => a.Name).HasColumnName("NAME");
  this.Property(a => a.AssetTypeId).HasColumnName("ASSETTYPEID");      
 }
}  

public class ProjectMap : EntityTypeConfiguration<Project>
{
  public ProjectMap()
  {
   this.Property(p => p.ProjectId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
   this.HasMany(p => p.SchedulePhases).WithRequired(sp => sp.Project).HasForeignKey(sp => 
   sp.ProjectId); 

  //table & column mappings
  this.ToTable("TBLPROJECT");
  this.Property(p => p.ProjectId).HasColumnName("PROJECTID");
  this.Property(p => p.AssetId).HasColumnName("ASSETID");
  this.Property(p => p.CapitalCategoryId).HasColumnName("CAPITALCATEGORYID");
  this.Property(p => p.Comments).HasColumnName("COMMENTS");
  this.Property(p => p.DesignationId).HasColumnName("DESIGNATIONID");
  this.Property(p => p.DispositionId).HasColumnName("DISPOSITIONID");
  this.Property(p => p.FMSNumber).HasColumnName("FMSNUMBER");
  this.Property(p => p.FundingSourceId).HasColumnName("FUNDINGSOURCEID");
  this.Property(p => p.ImplementerId).HasColumnName("IMPLEMENTERID");
  this.Property(p => p.IsApproved).HasColumnName("ISAPPROVED");
  this.Property(p => p.IsDeferred).HasColumnName("ISDEFERRED");
  this.Property(p => p.IsLongTermLease).HasColumnName("ISLONGTERMLEASE");
  this.Property(p => p.IsRollover).HasColumnName("ISROLLOVER");
  this.Property(p => p.IsSidewalkBridge).HasColumnName("ISSIDEWALKBRIDGE");
  this.Property(p => p.JobDescription).HasColumnName("JOBDESCRIPTION");
  this.Property(p => p.JobType).HasColumnName("JOBTYPE");
  this.Property(p => p.OrganizationId).HasColumnName("ORGANIZATIONID");
  this.Property(p => p.ProgramCategoryId).HasColumnName("PROGRAMCATEGORYID");
  this.Property(p => p.DsfId).HasColumnName("DSFID");
  this.Property(p => p.StatusId).HasColumnName("STATUSID");

  this.Map<DomainObjectModel.ObjectModel.Project.ProjectCIP>(m => m.Requires("PROJECTTYPEID").HasValue(15))
      .Map<DomainObjectModel.ObjectModel.Project.ProjectCapacity>(m => m.Requires("PROJECTTYPEID").HasValue(2));
 }
}

Asset-Klasse:

public class Asset
{
 public Asset()
 {
   Projects = new HashSet<Project>();      
 }

 [Key]
 public decimal AssetId { get; set; }

 [StringLength(20)]
 public string AssetNumber { get; set; }

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

 public decimal? AssetLevelId { get; set; }

 public decimal? AssetTypeId { get; set; }

 public virtual ICollection<Project> Projects { get; set; }    
}

Projektklasse:

public class Project
{
 public Project()
 {      
 } 

 [Key]
 public decimal ProjectId { get; set; }

 public decimal AssetId { get; set; }

 public decimal CapitalCategoryId { get; set; }

 //public decimal ProjectTypeId { get; set; }

 public decimal ProgramCategoryId { get; set; }   

 [StringLength(1024)]
 public string Comments { get; set; }

 public decimal ImplementerId { get; set; }

 public decimal StatusId { get; set; }

 public decimal DsfId { get; set; }

 [StringLength(20)]
 public string FMSNumber { get; set; }

 [StringLength(1024)]
 public string JobDescription { get; set; }

 [StringLength(2)]
 public string JobType { get; set; }

 public decimal OrganizationId { get; set; }

 [Required][StringLength(1)]
 public string IsRollover { get; set; }

 [Required][StringLength(1)]
 public string IsDeferred { get; set; }

 [Required][StringLength(1)]
 public string IsApproved { get; set; }

 [StringLength(1)]
 public string IsSidewalkBridge { get; set; }

 public decimal FundingSourceId { get; set; }

 public decimal? DesignationId { get; set; }

 public decimal? DispositionId { get; set; }

 [Required][StringLength(1)]
 public string IsLongTermLease { get; set; }

 public virtual Asset Asset { get; set; }   
}

Ich weiß nicht, wie ich dieses Problem beheben kann. Könnten Sie mir bitte sagen, was ich hier vermisse?

Ich verwende die Oracle-Datenbank und habe vor kurzem eine Lizenz von Devart für DotConnect für Oracle erworben.

Vielen Dank

Hallo

Ich habe diesen Fehler behoben, indem ich das Attribut [DataServiceKey] mit dem Primärschlüssel für jede POCO-Klasse eingerichtet habe. Bitte beziehen Sie sich darauf:http: //blog.marcgravell.com/2008/12/astoria-and-linq-to-sql-getting-started.htm.

Jetzt kann ich Entitäten über den Odata-Dienst verfügbar machen, aber wenn ich versuche, durch Eingabe einer URL (z. B. ... / WcfDataService1.svc / Assets) auf die Entitätssammlung zuzugreifen, wird der folgende Fehler ausgegeben:

Error

 <?xml version="1.0" encoding="utf-8" ?> 
 <m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
   <m:code /> 
   <m:message xml:lang="en-US">An error occurred while processing this request.</m:message> 
   <m:innererror>
     <m:message>Operation could destabilize the runtime.</m:message> 
     <m:type>System.Security.VerificationException</m:type> 
     <m:stacktrace>at queryable_reader(Object ) at   System.Data.Services.Providers.ReflectionServiceProvider.GetQueryRootForResourceSet(ResourceSet container) at System.Data.Services.Providers.ReflectionDataServiceProvider.GetQueryRootForResourceSet(ResourceSet resourceSet) at System.Data.Services.Providers.DataServiceProviderWrapper.GetQueryRootForResourceSet(ResourceSetWrapper resourceSet) at System.Data.Services.RequestUriProcessor.ComposeExpressionForEntitySet(SegmentInfo segment, IDataService service, Boolean isLastSegment, Boolean checkRights) at System.Data.Services.RequestUriProcessor.ComposeExpressionForSegments(IList`1 segments, IDataService service, Boolean isCrossReferencingUri) at System.Data.Services.RequestUriProcessor.ProcessRequestUri(Uri absoluteRequestUri, IDataService service, Boolean internalQuery) at System.Data.Services.DataService`1.ProcessIncomingRequestUri() at System.Data.Services.DataService`1.HandleRequest()</m:stacktrace> 
  </m:innererror>
 </m:error>

Wie löse ich das auf?

Vielen Dank

Antworten auf die Frage(1)

Ihre Antwort auf die Frage