In un blog precedente avevo parlato del Single Table Inheritance. Grazie ad un campo apposito è possibile decidere a quale entity farà parte il record di quella nostra tabella.
Il problema che sto cercando di risolvere in questi giorni si basa sul quesito:
E' possibile dividere una tabella in due entity senza questo campo?
Ma prima che subentri la confusione, il mio obbiettivo non è quello di creare due entity parallele come nel caso di quel blog (TextContents e LinkContents), ma una entity di base da cui deriva un'altra entity. Per esempio, da questa tabella:
Nome campo | Tipo |
Id | int |
Title | nvarchar(50) |
LongDescriptions | ntext |
Vorrei ottenere una struttura come questa (poi spiegherò il perché):
Il problema che mi ero posto è molto semplice: in caso volessi visualizzare tutti i record della tabella in un menu di scelta, la richiesta dei dati presenti in un'unica entity avrebbe richiesto tutti i campi anche quelli ntext (che potrebbero contenere, per assurdo, mega di documenti di testo), come si può evitare questo?
Ah, dimenticavo, visto che questi dati devono attraversare dei layer dell'applicativo, non voglio usare gli anonynous type, altrimenti sarebbe troppo facile scrivere:
var coll=from d in Context.Documents
select new { Id=d.Id, Title=d.Title };
return coll;
Anche se questa soluzione porta l'Entity Framework a inviare la giusta query al database:
SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title]
FROM [dbo].[Descriptions] AS [Extent1]
Una soluzione che mi hanno suggerito è creare una classe che ospiti solo quei dati:
public class Elenco
{
public int Id { get; set; }
public string Title { get; set; }
}
var coll = from c in context.Descriptions
select new Elenco { Id = c.Id, Title = c.Title };
foreach (var item in coll)
{
Response.Write(string.Format(
"{0} {1} <br />",
item.Id,
item.Title
));
}
Può andare. Si potrebbe trovare un'altra soluzione con l'uso delle viste. Creata questa vista:
select Id,Title from Descriptions
Si possono creare due entity distinte all'interno dell'editor di Visual Studio 2008:
Lo schifo è che sono due entity distinte, ma risolvono in parte il problema. Segnalo che, importata questa vista nell'editor, i campi vengono visti entrambi come key. Non è sufficiente modificare le proprietà nell'editor, è necessario aprire il file .edmx con un editor xml e cancellare la doppia key:
<EntityType Name="DescriptionsTitles">
<Key>
<PropertyRef Name="Id" />
<PropertyRef Name="Title" /> <-- Da cancellare
</Key>
<Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="Title" Type="nvarchar" Nullable="false" MaxLength="50" />
</EntityType>
<EntityType Name="DescriptionsTitles">
<Key>
<PropertyRef Name="Id" />
<PropertyRef Name="Title" /> <-- Da cancellare
</Key>
<Property Name="Id" Type="Int32" Nullable="false" />
<Property Name="Title" Type="String" Nullable="false" />
</EntityType>
Poco sopra nell'xml è possibile vedere com'è importata la vista:
<EntitySet Name="DescriptionsTitles" EntityType="TestEntitiesModel.Store.DescriptionsTitles" store:Type="Views" store:Schema="dbo" store:Name="DescriptionsTitles">
<DefiningQuery>SELECT
[DescriptionsTitles].[Id] AS [Id],
[DescriptionsTitles].[Title] AS [Title]
FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]
</DefiningQuery>
</EntitySet>
Questo comporta, alla richiesta dei dati, l'esecuzione di questa query:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title]
FROM (SELECT
[DescriptionsTitles].[Id] AS [Id],
[DescriptionsTitles].[Title] AS [Title]
FROM [dbo].[DescriptionsTitles] AS [DescriptionsTitles]) AS [Extent1]
Alla fine c'è la soluzione compatibile con l'Entity Framework e la mia necessità. Ma si deve mettere mano alla struttura del database. Si deve dividere quella tabella in due, spostando il campo LongDescriptions nella seconda naturalmente collegando il tutto. L'EF non farà una piega e vedrà il tutto in modo corretto e otterrei ciò che voglio.
Posso avere tutto ciò che voglio? No, non è possibile.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- C# e Net 6 in Kubernetes con Prometheus e Grafana, il 12 gennaio 2022 alle 21:58
- Snaturare Kubernetes evitando i custom container Docker, il 6 gennaio 2022 alle 19:40
- Provando Kaniko in Kubernetes come alternativa a Docker per la creazione di immagini, il 18 dicembre 2021 alle 20:11
- Divertissement con l'OpenID e Access Token, il 6 dicembre 2021 alle 20:05
- Operator per Kubernetes in C# e Net Core 6., il 28 novembre 2021 alle 19:44
- RBAC in Kubernetes verso gli operator, il 21 novembre 2021 alle 20:52