2010-11-10 5 views
1

J'ai un DB comme celui-ci que j'ai produit de EF: alt textQuelle est la bonne façon d'utiliser Entity Framework?

Maintenant, je voudrais ajouter une entité « fielduserinput » donc j'écris le code suivant:

public bool AddValueToField(string field, string value, string userId) 
    { 
     //adds a value to the db 
     var context = new DBonlyFieldsContainer(); 
     var fieldSet = (from fields in context.fieldSet 
         where fields.fieldName.Equals(field) 
         select fields).SingleOrDefault(); 
     var userSet = (from users in context.users 
         where users.id.Equals(userId) 
         select users).SingleOrDefault(); 

     var inputField = new fielduserinput { userInput = value, field = fieldSet, user = userSet }; 
     return false; 
    } 

Il est évident que ce n'est pas fini mais je pense que cela transmet ce que je fais.

Est-ce vraiment la bonne façon de procéder? Mon but est d'ajouter une ligne à fielduserinput qui contient la valeur et les références à user et field. Cela semble un peu fastidieux de le faire de cette façon. J'imagine quelque chose comme:

public bool AddValueToField(string userId, string value, string fieldId) 
{ 
    var context = new db(); 
    var newField = { field.fieldId = idField, userInput = value, user.id = userId } 
    //Add and save changes 
} 

Répondre

2

Pour les anciennes versions d'EF, je pense que vous faites plus ou moins ce qui doit être fait. C'est l'une des nombreuses raisons pour lesquelles je ne me sentais pas EF était prêt jusqu'à récemment. Je vais exposer le scénario que nous avons pour vous donner une autre option. Nous utilisons l'approche code first dans EF 4 CTP. Si ce changement est assez important, poursuivez votre lecture, attendez d'autres réponses (car Flying Speghetti Monster sait que je peux me tromper) et décidez si vous voulez mettre à niveau. Gardez à l'esprit que c'est un CTP et non un RC, donc des changements considérables pourraient venir. Mais si vous commencez à écrire une nouvelle application, je vous recommande fortement d'en lire avant d'aller trop loin. Avec la première approche du code, il est possible de créer des modèles contenant des propriétés pour une référence à un autre modèle et une propriété pour l'ID de l'autre modèle (User & UserId). Lorsqu'il est configuré correctement, la définition d'une valeur pour la référence ou l'identifiant définira correctement l'identifiant dans la base de données.

Prenez la classe suivante ...

public class FieldUserInput{ 
    public int UserId {get;set;} 
    public int FieldId {get;set;} 

    public virtual User User {get;set;} 
    public virtual Field Field {get;set;} 
} 

... et la configuration

public class FieldUserInputConfiguration{ 
    public FieldUserInputConfiguration(){ 
     MapSingleType(fli => new { 
      userid = fli.UserId, 
      fieldid = fli.FieldId 
     }; 
     HasRequired(fli => fli.User).HasConstraint((fli, u)=>fli.UserId == u.Id); 
     HasRequired(fli => fli.Field).HasConstraint((fli, f)=>fli.FieldId == f.Id); 
    } 
} 

Vous pouvez écrire le code ...

public void CreateField(User user, int fieldId){ 
    var context = new MyContext(); 
    var fieldUserInput = new FieldUserInput{ User = user, FieldId = fieldId }; 
    context.FieldUserInputs.Add(fieldUserInput); 
    context.SaveChanges(); 
} 

... ou vice inversement avec les propriétés et tout ira bien dans la base de données. Voici un great post sur la configuration complète de EF.

Un autre point à retenir est que ce niveau de configuration n'est pas nécessaire. Code d'abord est possible d'utiliser sans aucune configuration du tout si vous respectez les normes spécifiées dans le premier ensemble de messages référencés. Il ne crée pas les plus beaux noms dans la base de données, mais cela fonctionne.

Pas une bonne réponse, mais je pensais partager.

+0

Merci! Lien intéressant. Je suis en train de développer une nouvelle application qui va bientôt être mise en production, donc je vais rester à l'ancienne car je ne suis pas du tout familier avec cette approche. Cela semble doux, alors je vais y regarder. Merci encore – Phil

Questions connexes