Entity Framework 4 CTP 5 POCO - конфигурация, вставка и обновление «многие ко многим» - PullRequest
2 голосов
/ 12 февраля 2011

Мне действительно нужен кто-то, кто помог бы мне полностью понять, как установить отношения «многие ко многим» с 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; }
}

Как видите, MusicSheet может иметь много Authors или TagsAuthor или Tag может иметь несколько MusicSheets.

Опять же, мои вопросы:

  1. Что делать на EntityTypeConfiguration, чтобы установить связь междуих, а также сопоставление с таблицей / объектом, которая связана с отношением «многие ко многим».
  2. Как вставить новые музыкальные листы (где у него может быть несколько авторов или несколько тегов).
  3. Как обновить ноты.Например, я мог бы установить TagA , TagB на MusicSheet1, но позже мне нужно изменить теги на TagA и TagC .Похоже, мне нужно сначала проверить, существуют ли теги, если нет, вставить новый тег, а затем связать его с музыкальным листом (чтобы я не вставил TagA ?),Или это что-то уже обрабатывается фреймворком?

Большое спасибо.Я действительно надеюсь полностью понять это, а не просто делать это без полного понимания того, что происходит.Особенно на # 3.

Ответы [ 2 ]

5 голосов
/ 12 февраля 2011
  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; }
    }
    
  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();
    
  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();
    

Вы также можете найти любого известного вам автора и / или тега, который существует и добавлен в ваш MusicSheet, и наоборот, но это основа.

Помните, что это в первую очередь относится к коду EF4 CTP5 ...

Извините, мой английский не является моим основным языком, я надеюсь, что это поможет вам, с наилучшими пожеланиями из Доминиканской Республики.

PS: не забудьте добавить ссылки на EntityFramework и System.Data.Entity. Вы несете ответственность за выполнение чего-либо еще, например модульного тестирования, проверки, обработки исключений и т. Д.

EDIT:

Сначала вам нужно добавить конструктор к вашим моделям:

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; }
}

... Тогда вы можете сделать что-то вроде этого:

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();

Вы можете сделать то же самое для всех ваших моделей.

Надеюсь, это поможет вам!

0 голосов
/ 12 февраля 2011

Вам не нужно EntityTypeConfiguration, чтобы установить отношения между ними. Это должно работать как сейчас. С CTP5 все, что вам нужно сделать, чтобы установить отношение «многие ко многим», - это включить ICollection в обе сущности.

Теперь о том, как выполнять вставки и удаления, я знаю два способа. Обычно я использую создание сущности для результирующей таблицы отношения «многие ко многим», затем создаю экземпляр этой сущности и передаю ему все необходимые данные, включая экземпляры других сущностей иметь отношения многие ко многим). И, наконец, я просто добавляю его в репозиторий и фиксирую транзакцию (обычно используя класс UnitOfWork).

Быстрый пример:

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; }
}

Тогда я бы просто создал экземпляры сущности Bid.

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;
        }
    }
}
...