none
Entity framework code first Связь один ко многим. RRS feed

  • Вопрос

  • Всем добрый день, подскажите пожалуйста как создать связь между таблицами один ко многим и добавить значения в таблицы.

    Учусь работать с code-first и потому все делаю в консольном приложении.


    //Есть два класса, описывающие таблицы

    public class Words { [Key] public int WordID { get; set; } public string WordText { get; set; } public virtual ICollection<Translate> Translates { get; set; } } public class Translate { public int TranslateID { get; set; } public string Translates { get; set; } public int WordID { get; set; } public virtual Words Words { get; set; } }

    //класс контекста

    class DictionaryDB : DbContext
        {
            public DbSet<Words> Words { get; set; }
            public DbSet<Translate> Translate { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Translate>()
                    .HasRequired(t => t.Words)
                    .WithMany(w => w.Translates)
                    .HasForeignKey(t => t.WordID);
                base.OnModelCreating(modelBuilder);
            }
        }

    //класс инициализатор

    class DbInitializator:DropCreateDatabaseIfModelChanges<DictionaryDB>
        {
            protected override void Seed(DictionaryDB context)
            {

                base.Seed(context);

                context.Words.Add(new Words
                {
                    WordText = "Hello",

                });
                context.Words.Add(new Words
                {
                    WordText = "Goodby",
                });
                context.Words.Add(new Words
                {
                    WordText = "Mother",
                });
                context.Words.Add(new Words
                {
                    WordText = "Father",
                });

                context.SaveChanges();
            }
    Если у меня все правильно и сделано, так как надо, то:

    1) Как мне изменить класс инициализатор, что бы он добавлял значения по умолчанию в обе таблицы.

    2)Как описать добавлении данных в базу в обе таблицы в стороннем методе?

    20 августа 2012 г. 17:59

Ответы

  • На самом деле EF умная и писать много кода излишне.

    namespace EfCfTest
    {
      class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new DbInitializator());
          DictionaryDB db = new DictionaryDB();
          db.Words.Add(new Word() { WordID = 1 });
          db.SaveChanges();
        }
      }
      public class Word
      {
        public int WordID { get; set; }
        public string WordText { get; set; }
        public virtual ICollection<Translate> Translates { get; set; }
      }
      public class Translate
      {
        public int TranslateID { get; set; }
        public string Translates { get; set; }
        public int WordID { get; set; }
        public virtual Word Word { get; set; }
      }
      public class DictionaryDB : DbContext
      {
        public DbSet<Word> Words { get; set; }
        public DbSet<Translate> Translates { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          //Первичный ключ для Word
          modelBuilder.Entity<Word>().HasKey(w => w.WordID);
        }
      }
      class DbInitializator : DropCreateDatabaseIfModelChanges<DictionaryDB>
      {
        protected override void Seed(DictionaryDB context)
        {
    
          base.Seed(context);
    
          context.Words.Add(new Word
          {
            WordText = "Hello",
    
          });
          context.Words.Add(new Word
          {
            WordText = "Goodby",
          });
          context.Words.Add(new Word
          {
            WordText = "Mother",
          });
          context.Words.Add(new Word
          {
            WordText = "Father",
          });
    
          context.SaveChanges();
        }
      }
    }

    "Как описать добавлении данных в базу в обе таблицы в стороннем методе?" - тут не очень понятно, что именно нужно?


    • Изменено YatajgaEditor 20 августа 2012 г. 19:13
    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    20 августа 2012 г. 19:12
    Модератор
  • "У меня получается массив строк для добавления, как их добавить сразу в две таблицы, т.е. и в word и  translate?" - так

    class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new DbInitializator());
          DictionaryDB db = new DictionaryDB();
          string str = Console.ReadLine();
          string[] result = str.Split(' ');
    
          //Ну тут конечно надо проверять массив result.
          Word word = new Word() { WordID = 3, WordText = result[1] };
          Translate translate = new Translate { TranslateID = 4, WordID = word.WordID, Translates = result[1] };
    
          db.Words.Add(word);
          db.Translates.Add(translate);
    
          db.SaveChanges();
        }
      }

    "как добавить к словам по умолчанию переводы?" - так. Но лучше предварительные данные загружать сразу в БД, редактируя её на прямую, чтобы не засорять код.

    protected override void Seed(DictionaryDB context)
        {
    
          base.Seed(context);
    
          Word word = new Word() { WordID = 1, WordText = "Hello" };
          context.Words.Add(word);
          context.Translates.Add(new Translate() { TranslateID = 1, WordID = word.WordID, Translates = "Привет" });
          //.....................................
          context.SaveChanges();
        }

    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    21 августа 2012 г. 5:12
    Модератор
  • Так

    string str = Console.ReadLine();
          string[] result = str.Split(' ');
    
          string translates = "";
          for (int i = 1; i < result.Length; i++)
            translates = result[i] + ",";
    
          //Ну тут конечно надо проверять массив result.
          Word word = new Word() { WordID = 3, WordText = result[1] };
          Translate translate = new Translate { TranslateID = 4, WordID = word.WordID, Translates = translates 

    Правда это будет не очень эффективно. Лучше вводить сначала слово, а потом перевод.

    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    21 августа 2012 г. 5:44
    Модератор
  • Да и еще вот в этом классе

    class DbInitializator:DropCreateDatabaseIfModelChanges<DictionaryDB>
        {
            protected override void Seed(DictionaryDB context)
            {
    
                base.Seed(context);
    
                context.Words.Add(new Words
                {
                    WordText = "Hello",
    
                });
                context.Words.Add(new Words
                {
                    WordText = "Goodby",
                });
                context.Words.Add(new Words
                {
                    WordText = "Mother",
                });
                context.Words.Add(new Words
                {
                    WordText = "Father",
                });
    
                context.SaveChanges();
            }
    как добавить к словам по умолчанию переводы?

    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    21 августа 2012 г. 3:34

Все ответы

  • На самом деле EF умная и писать много кода излишне.

    namespace EfCfTest
    {
      class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new DbInitializator());
          DictionaryDB db = new DictionaryDB();
          db.Words.Add(new Word() { WordID = 1 });
          db.SaveChanges();
        }
      }
      public class Word
      {
        public int WordID { get; set; }
        public string WordText { get; set; }
        public virtual ICollection<Translate> Translates { get; set; }
      }
      public class Translate
      {
        public int TranslateID { get; set; }
        public string Translates { get; set; }
        public int WordID { get; set; }
        public virtual Word Word { get; set; }
      }
      public class DictionaryDB : DbContext
      {
        public DbSet<Word> Words { get; set; }
        public DbSet<Translate> Translates { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          //Первичный ключ для Word
          modelBuilder.Entity<Word>().HasKey(w => w.WordID);
        }
      }
      class DbInitializator : DropCreateDatabaseIfModelChanges<DictionaryDB>
      {
        protected override void Seed(DictionaryDB context)
        {
    
          base.Seed(context);
    
          context.Words.Add(new Word
          {
            WordText = "Hello",
    
          });
          context.Words.Add(new Word
          {
            WordText = "Goodby",
          });
          context.Words.Add(new Word
          {
            WordText = "Mother",
          });
          context.Words.Add(new Word
          {
            WordText = "Father",
          });
    
          context.SaveChanges();
        }
      }
    }

    "Как описать добавлении данных в базу в обе таблицы в стороннем методе?" - тут не очень понятно, что именно нужно?


    • Изменено YatajgaEditor 20 августа 2012 г. 19:13
    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    20 августа 2012 г. 19:12
    Модератор
  • Ну вот смотрите:

    Подаю строку в консоль readline

    string str = Console.ReadLine();
    
    string[] result = str.Split(' ');

    Строка примерно такого содержания hello алло привет здравствуйте. Т.е. в таблице words будет hello а в таблице translates будет алло, привет, здравствуйте, с одним и тем же id.

    У меня получается массив строк для добавления, как их добавить сразу в две таблицы, т.е. и в word и  translate?


    • Изменено akavoid 21 августа 2012 г. 3:14
    21 августа 2012 г. 3:13
  • Да и еще вот в этом классе

    class DbInitializator:DropCreateDatabaseIfModelChanges<DictionaryDB>
        {
            protected override void Seed(DictionaryDB context)
            {
    
                base.Seed(context);
    
                context.Words.Add(new Words
                {
                    WordText = "Hello",
    
                });
                context.Words.Add(new Words
                {
                    WordText = "Goodby",
                });
                context.Words.Add(new Words
                {
                    WordText = "Mother",
                });
                context.Words.Add(new Words
                {
                    WordText = "Father",
                });
    
                context.SaveChanges();
            }
    как добавить к словам по умолчанию переводы?

    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    21 августа 2012 г. 3:34
  • "У меня получается массив строк для добавления, как их добавить сразу в две таблицы, т.е. и в word и  translate?" - так

    class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new DbInitializator());
          DictionaryDB db = new DictionaryDB();
          string str = Console.ReadLine();
          string[] result = str.Split(' ');
    
          //Ну тут конечно надо проверять массив result.
          Word word = new Word() { WordID = 3, WordText = result[1] };
          Translate translate = new Translate { TranslateID = 4, WordID = word.WordID, Translates = result[1] };
    
          db.Words.Add(word);
          db.Translates.Add(translate);
    
          db.SaveChanges();
        }
      }

    "как добавить к словам по умолчанию переводы?" - так. Но лучше предварительные данные загружать сразу в БД, редактируя её на прямую, чтобы не засорять код.

    protected override void Seed(DictionaryDB context)
        {
    
          base.Seed(context);
    
          Word word = new Word() { WordID = 1, WordText = "Hello" };
          context.Words.Add(word);
          context.Translates.Add(new Translate() { TranslateID = 1, WordID = word.WordID, Translates = "Привет" });
          //.....................................
          context.SaveChanges();
        }

    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    21 августа 2012 г. 5:12
    Модератор
  • А как добавлять несколько переводов в этой строчке?

    Translate translate = new Translate { TranslateID = 4, WordID = word.WordID, Translates = result[1] };


    • Изменено akavoid 21 августа 2012 г. 5:23
    21 августа 2012 г. 5:22
  • Так

    string str = Console.ReadLine();
          string[] result = str.Split(' ');
    
          string translates = "";
          for (int i = 1; i < result.Length; i++)
            translates = result[i] + ",";
    
          //Ну тут конечно надо проверять массив result.
          Word word = new Word() { WordID = 3, WordText = result[1] };
          Translate translate = new Translate { TranslateID = 4, WordID = word.WordID, Translates = translates 

    Правда это будет не очень эффективно. Лучше вводить сначала слово, а потом перевод.

    • Помечено в качестве ответа akavoid 21 августа 2012 г. 6:47
    21 августа 2012 г. 5:44
    Модератор
  • А я думал, что эту ситуацию как то максрософт красиво обыграл.

    Потому и задал вопрос.

    Спасибо вам.

    21 августа 2012 г. 6:47