实体框架4 CTP 5 POCO - 多对多配置,插入和更新?

Sax*_*man 2 entity-relationship many-to-many entity-framework poco entity-framework-4

我真的需要有人帮助我完全理解如何与Entity Framework 4 CTP 5,POCO建立多对多的关系.我需要了解3个概念:

  1. 如何配置我的模型以指示一些表是多对多的.
  2. 如何正确插入.
  3. 如何正确地做更新.

这是我目前的型号:

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; }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,MusicSheet可以有多个Authors或者Tags,Author或者Tag可以有多个MusicSheets.

我的问题再次出现:

  1. 如何 EntityTypeConfiguration设置它们之间的关系以及映射到与多对多关系相关联的表/对象.
  2. 如何插入新的音乐表(可能有多个作者或多个标签).
  3. 如何更新音乐表.例如,我可能将TagA, TagB设置为MusicSheet1,但稍后我需要将标签更改为TagATagC.好像我需要首先检查标签是否已经存在,如果没有,插入新标签然后将其与乐谱相关联(这样我就不会重新插入TagA?).或者这是框架已经处理过的东西?

非常感谢你.我真的希望完全理解它而不仅仅是在没有完全理解正在发生的事情的情况下这样做.尤其是#3.

Ram*_*rez 5

  1. 在EF4 CTP5中,当您将公共虚拟ICollection放在多对多关系的每个类中时,默认约定完成关系,正如您已经完成的那样,您的上下文类应如下所示:

    public class YourContextName : DbContext
    {
        public DbSet<MusicSheet> MusicSheets { get; set; }
        public DbSet<Tag> Tags { get; set; }
        public DbSet<Author> Authors { get; set; }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 很简单,您只需创建一个MusicSheet类的实例,然后将作者和标签的所有实例添加到MusicSheet中的每个作者和标签集合中,然后将您的MusicSheet实例添加到MusicSheets的上下文集合中,然后致电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();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 要更新你必须加载你的MusicSheet并删除你不想要的标签,然后添加你需要添加的标签,这是如何:

        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();
    
    Run Code Online (Sandbox Code Playgroud)

您还可以找到您知道存在并添加到MusicSheet的任何作者和/或标签,反之亦然,但这是基础.

请记住这是EF4 CTP5代码首先......

对不起,我的英语不是我的主要语言,我希望这可以帮助你,多米尼加共和国的问候.

PS:不要忘记添加对EntityFramework和System.Data.Entity的引用,你有责任做其他事情,比如单元测试,验证,异常处理等等

编辑:

首先,您需要为模型添加构造函数:

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; }
}
Run Code Online (Sandbox Code Playgroud)

......然后你可以这样做:

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();
Run Code Online (Sandbox Code Playgroud)

您可以为所有型号执行相同的操作.

我希望这可以帮到你!