Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
David-
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 57
1

Entity Framework + Класс в котором есть объекты 3 классов

26.04.2014, 02:29. Просмотров 1286. Ответов 12
Метки нет (Все метки)

Доброй ночи.
Имеется вот такой вопрос:

К примеру у меня есть Класс (назовем его к примеру Книга)
У него внутри институализируется еще объекты 3 классов
Например есть класс Автор, Магазины, и еще что нибудь


если в виде кода - то я делаю так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public class Book
    {
        [Key]
        public int BookID { get; set; }
        public Author = new Author ();
        public Shops = new Shops ();
ну и еще какой нибудь класс
    }
 
теперь я бы хотел создать DbSet<Book> {get;set;}
добавляю в него искусственно так сказать 1 объект бука, но когда пытаюсь найти бук - у которого автор == Пушкин - е работает
 
Код:
     Book b = DataBase.Books.Where(m => m.Author.FirstName == "Пушкин ").First();
Уже не совсем голова сообраает что и куда

Вопрос такой: В каком направлении копать??

Если я правильно понял LINQ и ENtity ругаются на то что не знаю тип данных Автор

ЧТо делать??


Спасибо огромное заранее.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2014, 02:29
Ответы с готовыми решениями:

Entity framework, как связать класс и таблицу
Помогите разобраться. Допустим, что у нас есть класс public class user { ...

Entity Framework - Code first. Если есть навигационное свойство в классе, то зачем еще внешний ключ?
public class Author { public int AuthorId { get; set; } ...

Есть ли аналог в Entity Framework метода Contain() как Linq to Sql
например, чтобы в Linq отфильтровать в таблице по полю Name все строки, в...

Связь 1-1 entity framework
Преподаватель предоставил вот такую схему: Я создал классы таблиц, но вот...

Entity FrameWork for VS 2015
У меня есть библиотека классов. И их функционал нужно перенести в таблицы в...

12
ldkldk
24 / 24 / 5
Регистрация: 29.05.2013
Сообщений: 151
26.04.2014, 10:58 2
Цитата Сообщение от David- Посмотреть сообщение
C#
1
2
public Author = new Author ();
public Shops = new Shops ();
Ну это ж бред непонятный, откройте книгу по азам шарпа.
0
David-
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 57
26.04.2014, 15:10  [ТС] 3
Цитата Сообщение от ldkldk Посмотреть сообщение
C#
1
2
public Author = new Author ();
public Shops = new Shops ();
Ну это ж бред непонятный, откройте книгу по азам шарпа.
Я конечно благодарен за оперативность ответа, одако я думаю можно было догадаться что в сообщении на форуме просто допущена ошибка.

Разумеется я даю имя переменной при инстализации (в противном случае код просто бы не компелировался и проект не запускался)

Итак код Класса Book:

C#
1
2
3
4
5
6
7
8
   public class Book
    {
        [Key]
        public int BookID { get; set; }
        public string Name { get; set; }
        public Author a = new Author ();
        public Shops s= new Shops ();
   }
Class Shops :

C#
1
2
3
4
5
6
7
8
9
10
public class Shops 
    {
        public string Country { get; set; }
        public string City { get; set; }
        public string Address { get; set; }
        public string HomePhoneNumber { get; set; }
        public string MobileNumber { get; set; }
 
 
    }
Class Author:

C#
1
2
3
4
5
 public class Author
    {
        public string FirstName { get; set; }
        public string SecondName { get; set; }
    }

Контекст:

C#
1
2
3
4
 public class BookContext : DbContext
    {
       public DbSet<Book> Books{ get; set; }
    }
Теперь где я собственно пытаюсь искусственно сделать это хранилище и загнать туда 1 книгу:

Есть Controller BookController

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  public class BookController: Controller
    {
        //
        // GET: /Search/
       BookContext  Books= new BookContext();
 
        public BookController()
        {
 
            Book B1 = new Book();
            B1.Name = "Book_Name_1";
B1.a.FirstName = "Pushkin";
            Books.Books.Add(B1 );
            Contacts.SaveChanges();
        }
И для проверки делаю в методе контроллера такой код:

C#
1
2
3
4
5
6
7
8
public ActionResult Result()
        {
               Book B =Books.Books.Where(m => a.FirstName == "Pushkin").First();
 
           
                return View();
 
        }
Но увы и ах код ругается...
0
ldkldk
24 / 24 / 5
Регистрация: 29.05.2013
Сообщений: 151
26.04.2014, 18:12 4
Цитата Сообщение от David- Посмотреть сообщение
Я конечно благодарен за оперативность ответа, одако я думаю можно было догадаться что в сообщении на форуме просто допущена ошибка.
В том коде, к-рый вы привели в своем втором сообщении, таких "ошибок сообщения" стало еще больше - не охота и нет времени работать редактором. Будьте внимательней.

Исправление начните с переписывания этого куска:

C#
1
2
3
4
5
6
7
8
public class Book
    {
        [Key]
        public int BookID { get; set; }
        public string Name { get; set; }
        public Author a = new Author ();
        public Shops s= new Shops ();
   }
на такой:

C#
1
2
3
4
5
6
7
8
public class Book
    {
        [Key]
        public int BookID { get; set; }
        public string Name { get; set; }
        public Author Author { get; set;}
        public Shops Shop { get; set; }
   }
1
Diman777
361 / 333 / 108
Регистрация: 12.02.2013
Сообщений: 653
26.04.2014, 18:26 5
Лучший ответ Сообщение было отмечено David- как решение

Решение

David-, Book, Shops и Author - это ведь 3 разные таблицы, соответственно в BookContext еще должны присутствовать DBSet's для Shops и Author. + еще нужны везде Keys - в каждой таблице, а в первой таблице свойства - указывающие на эти ключи

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   public class Book
    {
        [Key]
        public int BookID { get; set; }
        public string Name { get; set; }
        
        public int AuthorID { get; set; }
        [ForeignKey("AuthorID")]
        public virtual Author a;
 
        public int ShopsID { get; set; }
        [ForeignKey("ShopsID")]
        public Shops s;
   }
C#
1
2
3
4
5
6
7
8
9
10
public class Shops 
    {
        [Key]
        public int ID { get; set; }
        public string Country { get; set; }
        public string City { get; set; }
        public string Address { get; set; }
        public string HomePhoneNumber { get; set; }
        public string MobileNumber { get; set; }
    }
C#
1
2
3
4
5
6
7
 public class Author
    {
        [Key]
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string SecondName { get; set; }
    }
C#
1
2
3
4
5
6
public class BookContext : DbContext
    {
       public DbSet<Book> Books{ get; set; }
       public DbSet<Shops> ShopList{ get; set; }
       public DbSet<Author> Authors{ get; set; }
    }
1
David-
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 57
26.04.2014, 18:46  [ТС] 6
Цитата Сообщение от Diman777 Посмотреть сообщение
David-, Book, Shops и Author - это ведь 3 разные таблицы, соответственно в BookContext еще должны присутствовать DBSet's для Shops и Author. + еще нужны везде Keys - в каждой таблице, а в первой таблице свойства - указывающие на эти ключи
Во-первых огромное спасибо за ответ лишенный каких-либо эмоций.
Во-вторых огромное спасибо за подсказки - буду сейчас пробовать
В третьих - чтобы могли порекомендовать прочесть на тему EF


Спасибо.
0
ldkldk
24 / 24 / 5
Регистрация: 29.05.2013
Сообщений: 151
26.04.2014, 19:29 7
Цитата Сообщение от David- Посмотреть сообщение
В третьих - чтобы могли порекомендовать прочесть на тему EF
Вот отличный мануал, как раз то что вам нужно http://www.asp.net/mvc/tutorials/get...vc-application
1
David-
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 57
26.04.2014, 20:02  [ТС] 8
Цитата Сообщение от ldkldk Посмотреть сообщение
Вот отличный мануал, как раз то что вам нужно http://www.asp.net/mvc/tutorials/get...vc-application
Большое спасибо, и за предыдущий ответ ксттаи, так же
0
David-
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 57
28.04.2014, 01:00  [ТС] 9
Цитата Сообщение от ldkldk Посмотреть сообщение
Вот отличный мануал, как раз то что вам нужно http://www.asp.net/mvc/tutorials/get...vc-application
Еще раз хотелось бы выразить благодарность за данный мануал, а так же обратить внимание всех начинающих(таких как я) на данный мануал.

Всем удачи и хорошей недели!

Добавлено через 1 час 45 минут
Появился еще такой вопросик:

приведу сначала пример :

Например теперь у меня есть класс Автор:
C#
1
2
одно из его свойств это:
 public virtual ICollection<Book> Books{ get; set;}
И у меня есть страница Edit - на которой я отображаю все свойства данного автора

и мне нужно как то реализовать так, чтобы на этой страницы я мог добавить в этот "массив" - новый объект Book

Ребят подскажите куда глянуть
(не отрицаю что есть в том мануале - но пока не нашел)
0
ldkldk
24 / 24 / 5
Регистрация: 29.05.2013
Сообщений: 151
28.04.2014, 11:00 10
Цитата Сообщение от David- Посмотреть сообщение
не отрицаю что есть в том мануале - но пока не нашел
Там этого и нет, если мне не изменяет память. Вам сначала нужно смотреть привязку модели в MVC, а конкретно привязку к коллекциям. В случае лишь редактирования элементов коллекции там все до ужаса просто, а вот в случае добавления новых элементов прийдется поднапрячься - возникает проблема с формированием соответствующей разметки для добавляемого эл-та, а конкретно для его индекса.

Я решал эту проблему с помощью такого подхода:
http://blog.stevensanderson.com/2010...t-mvc-2-style/

Добавлено через 8 минут
Если кол-во добавляемых в коллекцию эл-тов заранее известно и ограничено можете не париться почитать лишь про привязку к коллекциям. В таком случае за вас все сделает MVC, лишь формируете разметку для изветного кол-ва добавляемых книг и выдаете ее во вьюху. В пост-контроллере лишь проверяете внес ли пользователь данные для "пустых" книг и соответствено сохраняете или нет изменения.
0
David-
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 57
03.05.2014, 18:38  [ТС] 11
Дабы не создавать новые темы, думаю лучше задать вопрос в этой.

в общем не могу понять как разрешить такую проблему:


Есть метод регистрации:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  
 
 public bool Registration(User new_user)
        {
            bool result = false;
            var user_check = db.Users.Where(p => p.UserEmail == new_user.UserEmail).SingleOrDefault();
 
            if(user_check == null)
            {
                db.Users.Add(new_user);
                db.SaveChanges();
 
                Contacts NewContact = create_contact(new_user);
 
                db.Contacts.Add(NewContact);
                db.SaveChanges();
                result = true;
            }
 
            return result;
        }
 
 
        private Contacts create_contact(User new_user)
        {
            Contacts new_contact = new Contacts();
            var user_check = db.Users.Where(p => p.UserEmail == new_user.UserEmail).SingleOrDefault();
            if (user_check != null)
            {
                new_contact.Email = new_user.UserEmail;
                new_contact.UserID = user_check.UserID;
            
                return new_contact;
            }
            else
            {
                return null;
            }
        }
Проблема возникает вот в этой строчке:
C#
1
2
  db.Contacts.Add(NewContact);
                db.SaveChanges();
Именно в SaveChanges();

Кто может объяснить в чем проблема?
Спасибо большое.

Добавлено через 53 секунды
P.S -
Ошибку пишет следующую:

An exception of type 'System.Data.Entity.Infrastructure.DbUpdateException' occurred in EntityFramework.dll but was not handled in user code Additional information: An error occurred while updating the entries. See the inner exception for details.
0
LooseVoice
54 / 54 / 14
Регистрация: 18.04.2014
Сообщений: 170
03.05.2014, 18:48 12
See the inner exception for details.
могли бы самый этот inner exception и выложить, чаще всего там хорошо описана причина ошибки, особенно при работе с EF
1
David-
3 / 3 / 2
Регистрация: 11.03.2014
Сообщений: 57
03.05.2014, 19:00  [ТС] 13
Цитата Сообщение от LooseVoice Посмотреть сообщение
See the inner exception for details.
могли бы самый этот inner exception и выложить, чаще всего там хорошо описана причина ошибки, особенно при работе с EF
Спасибо. Решил проблему - оказалось все в банальном DateTime (DateTime2)

Cпасибо что откликнулись
0
03.05.2014, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2014, 19:00

MVC + Entity Framework
Подскажите плз ORM, а возможно и СУБД для более комфортной работы. Планируется...

Добавление в Entity Framework
Гуглил, но не особо понял , что нужно , чтобы пофиксить это Выборка нормально,...

Проблемка с Entity Framework
Здравствуйте, проблема такого плана - пока файл с .edmx расширением создается в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru