2009-11-03 21 views
1

Lorsque vous utilisez LINQ to SQL ou Entity Framework, je peux facilement générer une classe pour chaque tableau qui prend en charge les bases de CRUD:Avoir deux objets Modèle pour une table est-il une pratique courante avec LINQ-to-SQL/Entity Framework?

Info info = new Info(); 
info.Title = "testing"; 
db.Infos.InsertOnSubmit(info); 
db.SubmitChanges(); 

Et quand je fais changements structurels à une table de base de données, je peux facilement régénérer la classe du modèle de la table (en le supprimant simplement dans le concepteur et en faisant glisser la table au concepteur à nouveau). Cependant, cela écrase bien sûr tout ce qui était dans la classe.

Ainsi, afin d'ajouter fonctionnalités supplémentaires à chaque classe qui ne soit pas effacé quand je Régénérer le modèle, je me retrouve avec une classe de modèle supplémentaire pour chaque table, donc deux couches de données en vigueur.

Est-ce une pratique courante ou existe-t-il un moyen d'ajouter des fonctionnalités aux classes générées qui ne sont pas écrasées lors de la régénération des classes?

Répondre

6

Créez une classe avec le même nom (dans un fichier de code source différent) et placez toutes les fonctionnalités étendues que vous souhaitez.

+0

merci cela fonctionne très bien –

2

Comme décrit? Non ce n'est pas.

Vous résolvez le problème en ajoutant des fonctionnalités supplémentaires en utilisant des classes partielles. Les classes partielles vont dans un fichier séparé de sorte que lorsque vous supprimez et recréer la classe dans le concepteur, votre code reste et vient juste d'être attaché comme par magie.

Donc, si vous avez un modèle:

MyDataClasses.dbml 

ce qui a des fichiers:

MyDataClasses.dbml.layout 
MyDataClasses.designer.cs 

Vous ajoutez le fichier suivant (Visual Studio fera pour vous si vous faites « Voir code » sur le fichier .dbml):

MyDataClasses.cs 

en cela, vous pouvez étendre le DataContext ajouter le comportement lors de la modification des données:

partial void InsertBooking(Booking instance) 
{ 
    instance.LastModified = DateTime.Now; 
    if (this.AuditUserID.HasValue) 
    { 
     instance.LastModifiedByID = this.AuditUserID; 
    } 

    this.ExecuteDynamicInsert(instance); 
} 

partial void UpdateBooking(Booking instance) 
{ 
    instance.LastModified = DateTime.Now; 
    if (this.AuditUserID.HasValue) 
    { 
     instance.LastModifiedByID = this.AuditUserID; 
    } 

    this.ExecuteDynamicUpdate(instance); 
} 

Et les classes individuelles pour ajouter des comportements, des champs calculés, etc. Si vous prenez quelque chose comme ASP.NET Dynamic Data où vous pouvez également ajouter des annotations et des classes pour Meta données cela peut être assez complexe.