2

J'ai vraiment besoin de quelqu'un pour m'aider à comprendre comment faire une relation plusieurs-à-plusieurs avec Entity Framework 4 CTP 5, POCO. Je dois comprendre 3 concepts:Entity Framework 4 CTP 5 POCO - Configuration plusieurs-à-plusieurs, insertion et mise à jour?

  1. Comment config mon modèle indique certaines tables sont nombreuses à plusieurs.
  2. Comment insérer correctement.
  3. Comment faire pour mettre à jour correctement.

Voici mes modèles actuels:

public class MusicSheet 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Key { get; set; } 

    public virtual ICollection<Author> Authors { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
} 

public class Author 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Bio { get; set; } 

    public virtual ICollection<MusicSheet> MusicSheets { get; set; } 
} 

public class Tag 
{ 
    [Key] 
    public int ID { get; set; } 
    public string TagName { get; set; } 

    public virtual ICollection<MusicSheet> MusicSheets { get; set; } 
} 

Comme vous pouvez le voir, le MusicSheet peut avoir plusieurs Authors ou Tags, et un Author ou Tag peut avoir plusieurs MusicSheets.

Encore une fois, mes questions sont les suivantes:

  1. Que faire sur le EntityTypeConfiguration pour régler le avec le nombre à plusieurs rapports entre eux ainsi que cartographie à une table/objet associés relation.
  2. Comment insérer un nouveau musique partitions (où il peut avoir plusieurs auteurs ou plusieurs étiquettes).
  3. Comment mettre à jour une partition musicale. Pour exemple, je pourrais mettre TagA, TagB à MusicSheet1, mais plus tard, je dois changer les balises pour TagA et TagC. Il semble que je dois vérifier d'abord pour voir si les balises existe déjà, sinon, insérez la nouvelle balise, puis l'associer à la partition (pour que je ne pas revissez TagA?). Ou c'est quelque chose déjà traité par le cadre ?

Merci beaucoup. J'espère vraiment le comprendre au lieu de simplement le faire sans vraiment comprendre ce qui se passe. Surtout sur # 3.

Répondre

5
  1. Dans le EF4 CTP5 la relation se fait par convention par défaut lorsque vous mettez ICollection virtuel public dans chacune des classes de plusieurs à plusieurs, comme vous l'avez déjà fait, votre classe de contexte devrait ressembler comme ceci:

    public class YourContextName : DbContext 
    { 
        public DbSet<MusicSheet> MusicSheets { get; set; } 
        public DbSet<Tag> Tags { get; set; } 
        public DbSet<Author> Authors { get; set; } 
    } 
    
  2. Très simple, vous venez de créer une instance de la classe MusicSheet puis ajoutez toutes les instances de vous des auteurs et des balises à chacune des collections d'auteurs et mots clés dans votre MusicSheet, puis ajoutez votre instance de MusicSheet à votre suite poste collection de MusicSheets puis appelez SaveChanges:

     MusicSheet musicSheet = new MusicSheet 
               { 
                Title = "Music Sheet 1", 
                Key = "Key", 
                Authors = new List<Author> 
                    { 
                     new Author 
                      { 
                       Name = "Author 1", 
                       Bio = "Author 1 biographic text..." 
                      }, 
                     new Author 
                      { 
                       Name = "Author 2", 
                       Bio = "Author 2 biographic text..." 
                      } 
                    }, 
    
                Tags = new List<Tag> 
                   { 
                    new Tag {TagName = "TagA"}, 
                    new Tag {TagName = "TagC"} 
                   } 
               }; 
    
    
        var context = new YourContextName(); 
        context.MusicSheets.Add(musicSheet); 
        context.SaveChanges(); 
    
  3. Pour vous mettre à jour devez charger votre MusicSheet et supprimer les balises que vous ne voulez pas, puis ajoutez ceux que vous devez ajouter, voici comment:

    var context = new YourContextName(); 
        var myMusicSheet = context.MusicSheets.First(); 
    
        //The Tag you wnat to remove. 
        var tagToRemove = myMusicSheet.Tags.First(); 
    
        var tagToAdd = new Tag {TagName = "TagX"}; 
    
        myMusicSheet.Tags.Remove(tagToRemove); 
        myMusicSheet.Tags.Add(tagToAdd); 
    
        context.Entry(myMusicSheet).State = EntityState.Modified; 
        context.SaveChanges(); 
    

vous pouvez également trouver un auteur et/ou une étiquette que vous savez qui existent et ajouté à votre MusicSheet et vice versa, mais cela est le fondement.

Rappelez-vous ceci est pour le Code EF4 CTP5 premier ...

Excusez-moi mon anglais est pas ma langue principale, j'espère que cela peut vous aider, meilleures salutations de la République Dominicaine.

PS: Ne pas oublier d'ajouter des références à EntityFramework et System.Data.Entity, est de votre responsabilité de faire quoi que ce soit d'autre comme test unitaire, la validation, la gestion des exceptions ... etc

EDIT:

vous devez d'abord ajouter un constructeur à vos modèles:

public class Tag 
{ 
    [Key] 
    public int ID { get; set; } 
    public string TagName { get; set; } 

    public Tag() 
    { 
     MusicSheets = new List<MusicSheet>(); 
    }   

    public virtual ICollection<MusicSheet> MusicSheets { get; set; } 
} 

... Ensuite, vous pouvez faire quelque chose comme ceci:

var context = new YourContextName(); 
var newMusicSheet = new MusicSheet(); 
    newMusicSheet.Title = "Newly added Music Sheet"; 

//Your existing Tag. 
var existingTag = contex.Tags.Find(3);   

existingTag.MusicSheets.Add(existingTag); 

context.Entry(existingTag).State = EntityState.Modified; 
context.SaveChanges(); 

Vous pouvez faire la même chose pour tous vos modèles.

J'espère que cela peut vous aider!

+0

Merci beaucoup, j'ai eu # 1 & # 2 répondu et compris :) Sur ma question de mise à jour: J'ai besoin de trouver les tags/auteurs existants et de les supprimer avant d'en ajouter un nouveau? Je ne peux pas simplement leur fournir des tags/auteurs et le framework vient juste de sortir et se mettre à jour? Juste s'assurer :) Merci encore. – Saxman

+0

Oui, vous pouvez obtenir plus de flexibilité dans le processus d'insertion en initialisant vos collections dans le constructeur.Cheers man! –

+0

Hey BBHorus, j'ai une autre question sur l'insertion. Que se passe-t-il si j'insère une nouvelle partition avec certains des tags déjà existants? Comment ferais-je cela sans créer de tags en double? Merci. – Saxman

0

Vous n'avez pas vraiment besoin d'une EntityTypeConfiguration pour définir la relation entre eux. Cela devrait fonctionner comme maintenant. Avec CTP5, tout ce que vous avez à faire pour établir une relation many-to-many est d'inclure ICollection dans les deux entités.

Maintenant sur la façon d'effectuer des insertions et des suppressions, il y a deux façons que je connais. Celui que j'utilise habituellement est de créer une entité pour la table résultante de la relation plusieurs-à-plusieurs, puis de créer une instance de cette entité et de la nourrir avec toutes les données requises, y compris les instances des autres entités (celles qui avoir la relation plusieurs-à-plusieurs). Et finalement, je l'ajoute simplement au référentiel et valide la transaction (en utilisant généralement une classe UnitOfWork).

Exemple rapide:

public class Item 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<Bid> Bids { get; set; } 
} 

public class User 
{ 
    public int ID { get; set; } 
    public string Username{ get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public virtual ICollection<Bid> Bids { get; set; } 
} 

public class Bid 
{ 
    public int ID { get; set; } 
    public float Amount { get; set; } 
    public DateTime Date { get; set; } 
    public virtual Item Item { get; set; } 
    public virtual User User { get; set; } 
} 

Alors je voudrais simplement créer des instances de l'entité offre.

public void PlaceBid(User user, Item item, int amount) 
{ 
    if (ValidateBid(amount, user, item)) 
    { 
     Bid bid = new Bid 
     { 
      Amount = amount, 
      Date = DateTime.Now, 
      User = user, 
      Item = item 
     }; 

     try 
     { 
      repository.Add(bid); 
      unitOfWork.Commit(); 
     } 
     catch (Exception ex) 
     { 
      //TODO: Log the exception 
      throw; 
     } 
    } 
} 
Questions connexes