Domanda

Sto cercando di filtrare le entità in base al tipo di negozio (tabella o vista).

Ho 2 entità nel mio progetto di test, una fonte è una tabella e l'altra fonte è una vista.

<EntitySet Name="Test" EntityType="TestModel.Store.Test" store:Type="Tables" Schema="dbo" />
<EntitySet Name="TestView" EntityType="TestModel.Store.TestView" store:Type="Views" store:Schema="dbo" store:Name="TestView">

L'esempio di codice sopra riportato è tratto dalla sezione SSDL del file edmx del modello.

Penso che il archivio: digita le informazioni in SSDL siano ciò di cui ho bisogno, ma non sono riuscito a trovare un modo per recuperare quel valore utilizzando l'API framework entità.

Qualsiasi aiuto sarà apprezzato.

È stato utile?

Soluzione

Bene, puoi eseguire una query sui metadati in SSDL cercando in SSpace o StoreItemCollection.

vale a dire.

var sspaceEntitySets = context.MetadataWorkspace
                       .GetItems<EntityContainer>(DataSpace.SSpace)
                       .First().BaseEntitySets.OfType<EntitySet>();
var entitySet = sspaceEntitySets.First();
var tableType = entitySet
.MetadataProperties["http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Type"]
.Value.ToString();

Sfortunatamente questo non ti aiuterà a legare le tue classi al fatto che provengano da una tabella o da una vista. Poiché le Entità (ovvero quelle contro cui codifichi in CSpace) anziché quelle che descrivono le forme della tabella (ovvero quelle SSpace) sono in CSpace e per sapere se un'entità proviene da una vista o da una tabella, devi per poter ottenere da EntitySet CSpace a EntitySet SSpace tramite il Mapping.

Sfortunatamente l'EF non espone CSSPace pubblico (cioè non c'è modo di usare l'API per leggere il frammento MSL di EDMX).

Quindi per fare questo dovresti ragionare manualmente sull'elemento MSL, probabilmente usando LINQ to XML o qualcosa del genere.

Spero che questo aiuti

Alex

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top