EDM => pérennité
Imaginons le cas suivant :
une table Employees définit comme suit :
CREATE TABLE [dbo].[Employees](
[EmployeeID] [uniqueidentifier] NOT NULL,
[LastName] [nvarchar](20) NOT NULL,
[FirstName] [nvarchar](10) NOT NULL,
[Out] [bit] NULL,
CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED
(
[EmployeeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
une entité en mapping 1-1 avec la table.
Maintenant, imaginons que le DBA décide de scinder la table Employees en 2 : une table EmployeesInActivity et une table OutEmployees (définies avec la même structure qu'Employees sans la colonne Out).
Ceci pourrait entrainer de grosses modifications dans le code mais grâce à EDM, il va être possible de réduire considérablement l'impact de cette modif.
Premièrement, il va falloir modifier la partie description de la base (ssdl) en supprimant l'ancienne table et en ajoutant les deux nouvelles.
Ensuite, il va juste falloir modifier le mapping (msl). Voici à quoi ressemblerait alors le msl :
<EntitySetMapping Name="EmployeesSet">
<EntityTypeMapping TypeName="IsTypeOf(TestModel.Employees)">
<MappingFragment StoreEntitySet="EmployeesInActivity">
<Condition Name="Out" Value="false"/>
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="EmployeeID" ColumnName="EmployeeID" />
</MappingFragment>
<MappingFragment StoreEntitySet="OutEmployees">
<Condition Name="Out" Value="true"/>
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="EmployeeID" ColumnName="EmployeeID" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
Ce qui est particulièrement intéressant c'est qu'on va garder la propriété Out sur l'entité et que cette propriété sera correctement renseignée alors qu'il n'y a plus de colonne Out en base, Out sera maintenant évalué via la table de provenance (EmployeesInActivity ou OutEmployees).
Maintenant, plus fort encore. Que va-t-il se passer quand on va sauver le contexte après avoir passé la propriété Out d'un employé de false à true ?
exec sp_executesql N'insert [dbo].[ OutEmployee]([EmployeeID], [LastName], [FirstName
values (@0, @1, @2)
',N'@0 uniqueidentifier,@1 nvarchar(1),@2 nvarchar(1)',@0='EA85CF90-6065-4548-BA87-61845B32FD44',@1=N'A',@2=N'a'
exec sp_executesql N'delete [dbo].[ EmployeesInActivity]
where ([EmployeeID] = @0)
',N'@0 uniqueidentifier',@0='EA85CF90-6065-4548-BA87-61845B32FD44'
Et oui, ce cas marche aussi.
Ainsi, la modif du DBA n'aura aucun impact sur votre code, juste un impact minime sur votre modèle. En comparaison des modifications que cela aurait pu entrainer auxquels il fait rajouter le fait de retester l'application, l'intérêt d'EDM est indéniable.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :