Entity Framework. Una tabella due Entity senza discriminazioni

di Andrea Zani, in .NET,

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é):

nuove entity

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:

due entity con tabella e vista

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.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese