2014-09-16 14 views
8

Używam usługi danych WCF (Odata) z platformą .NET 4.5.1 i EF 6.1. Użyłem kodu pierwszego podejścia do tworzenia modelu EF. Kiedy odwołać ten model EF (AddProjectModel.cs) do WCF OData Service (WcfDataService1.svc), generuje następujący błąd:Usługa OData usługi WCF i EF 6 - nie można ujawnić podmiotów korzystających z usługi Odata

Błąd:

Serwer napotkał błąd podczas przetwarzania żądania. Komunikatem wyjątku jest "W kontekście typu danych" AddProjectModel ", istnieje najlepsza własność IQueryable" Aktywa ", której typem elementu nie jest typ jednostki. Upewnij się, że właściwość IQueryable ma typ jednostki lub określ atrybut IgnoreProperties dla typu kontekstu danych, aby zignorować tę właściwość. ". Zobacz dzienniki serwera, aby uzyskać więcej szczegółów. Śledzenia wyjątków stos jest:

w System.Data.Services.Providers.ReflectionServiceProvider.PopulateMetadata (ProviderMetadataCacheItem metadataCacheItem) w System.Data.Services.Providers.BaseServiceProvider.LoadMetadata (logiczna skipServiceOperations) w System.Data.Services.DataService 1.CreateInternalProvider(Object dataSourceInstance) at System.Data.Services.DataService 1.CreateMetadataAndQueryProviders (IDataServiceMetadataProvider & metadataProviderInstance, IDataServiceQueryProvider & queryProviderInstance, obiekt & dataSourceInstance, logiczny & isInternallyCreatedProvider) w System.Data.Services.DataService 1.CreateProvider() at System.Data.Services.DataService 1.HandleRequest() w System.Data.Services.DataService`1.ProcessRequestForMessage (strumień messageBody) w SyncInvokeProcessRequestForMessage (Object, Object [], Object []) w System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (Object instance, Object [] inputs, Object [] & outputs) w System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & rpc) w System.ServiceModel.Dispatcher. ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc & RPC) w System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc & RPC) w System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4 (MessageRpc & RPC) w System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31 (MessageRpc & rpc) w System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3 (MessageRpc & rpc) w System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2 (MessageRpc & RPC) w System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11 (MessageRpc & RPC) w System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1 (MessageRpc & RPC) w System.ServiceModel.Dispatcher.MessageRpc.Process (logiczna isOperationContextSet)

Oto mój WCF Data Service: 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; 
    } 
} 
} 

mojego kodu Pierwszy model: AddProjectModel.cs klasa

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

Zaleta:

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

klasa Projekt:

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

nie wiem jak rozwiązać ten problem. Czy możesz mi powiedzieć, czego tu brakuje?

Używam bazy danych Oracle i niedawno zakupiliśmy licencję od devart dla dotConnect for oracle.

Dzięki,


Cześć,

mam rozwiązać ten problem poprzez utworzenie [DataServiceKey] atrybut z klucza podstawowego na każde zajęcia poco. Proszę odnieść się do tego: http://blog.marcgravell.com/2008/12/astoria-and-linq-to-sql-getting-started.html.

Teraz mogę narazić podmioty przez służby OData ale gdy próbuję uzyskać dostęp do kolekcji podmiot wpisując URL zgłasza następujący błąd (ex .../WcfDataService1.svc/aktywa.):

Błąd:

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

Jak rozwiązać ten problem?

Dzięki,

Odpowiedz

33

Aby użyć WCF DataService z EF6, są tam niektóre dodatkowej pracy do zrobienia. Proszę sprawdzić dwóch następujących blogach o szczegóły:

Using WCF Data Services 5.6.0 with Entity Framework 6+

WCF Data Services Entity Framework Provider is updated with WCF Data Service 5.6.2

Generalnie musisz następujące dwa etapy:

  1. zainstalować najnowszy pakiet Nuget Microsoft.OData.EntityFrameworkProvider następującego po przewodnik na tej stronie;
  2. Wymień DataService z EntityFrameworkDataService, powiedzmy w WcfDataService1.svc:

    public class WcfDataService1: EntityFrameworkDataService

+1

Thanks Karata. Teraz to działa. – user659469

+2

Dzięki. Dlaczego och, dlaczego Microsoft nie zaktualizuje swoich Tutorials! – yonsk

+0

Zajęło mi to 6 godzin, aby to znaleźć. – Omzig