Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Связь один к одному EF Code First / 25 сообщений из 357, страница 1 из 15
22.10.2014, 03:24
    #38783563
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Ребят, подскажите пожалуйста как связь один к одному сделать в Code First логике EF.
У меня есть таблица "Карточки", с полями: НомерКарточки и ИдЗаписи.
И есть таблица "Записи" где есть ИдЗаписи и ещё несколько чисто информативных полей, дата, время...

Так вот, когда выдается карточка в таблицу "Карточки" записывается НомерКарточки, допустим "1" и ИдЗаписи допустим "21". Соответственно в таблицу "Записи" записывается ИдЗАписи (21) и остальные информативные поля. Когда карточка возвращается, мы находим в поле НомерКарточки номер возвращенной карточки (1) и удаляем эту запись, при этом в таблице "Записи" всё остается.
Т.е. таблица "Карточки" должна быть такая, динамическая, я ее хотел без поля Id сделать, но на сколько я понял, в CodeFirst без поля ID не обойтись.

Подскажите как правильней будет организовать поля в табице? Я так понимаю связь создается один к одному, но не возникнет ли у меня проблем при удалении из таблицы "Карточки"? Как сделать уникальное поле "НомерКарточки"? т.е. чтобы цифры там не повторялись. И обязательно ли поле Id? Как можно без него обойтись? Был бы очень признателен примеру подобного класса!
...
Рейтинг: 0 / 0
22.10.2014, 09:00
    #38783630
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Немного снизошло озарение, сделал так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    public class Card
    {
        public int Id { get; set; }
        
        public int CardNumber { get; set; }

        public virtual Person Person { get; set; }
    }

    public class Person
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public System.DateTime Date { get; set; }

    }


Надеюсь что правильно составил, хотя поле CardNumber наверняка не уникальное...

Теперь не знаю как вывести в один дата грид связанные таблицы? Получается только либо одну, либо другую:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
        public DataTable GetAll()
        {
            using (var context = new MyDbContext())
            {
                IList<Card> cards = context.Cards.ToList();

                return cards.ToDataTable<Card>();
            }
        }
...
Рейтинг: 0 / 0
22.10.2014, 09:12
    #38783636
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Если связь действительно 1:1, то "ID записи" не нужно. Зачем вводить лишнюю сущность? При связи 1:1 используется единый ключ. Класс при этом в CF объявляется так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public class Card
    {
        public int Id { get; set; }
    
        ///...    другие поля
    }

    public class Person : Card
    {

        public string Name { get; set; }

        public System.DateTime Date { get; set; }

    }


тогда, делая выборку из Card вы получите выборку из двух таблиц
...
Рейтинг: 0 / 0
22.10.2014, 09:25
    #38783648
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Вот даже как... А при это я смогу удалять записи из Таблицы Cards, но чтобы в таблице Person связанные записи оставались?
...
Рейтинг: 0 / 0
22.10.2014, 09:37
    #38783658
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
и ещё вопрос, а как всё таки мне теперь из таблицы Cards всё вытащить? по прежнему вытаскивается только два поля...
...
Рейтинг: 0 / 0
22.10.2014, 10:10
    #38783700
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
viton-zizuВот даже как... А при это я смогу удалять записи из Таблицы Cards, но чтобы в таблице Person связанные записи оставались?Нет. Это тогда уже не связь 1:1 будет.

viton-zizuи ещё вопрос, а как всё таки мне теперь из таблицы Cards всё вытащить? по прежнему вытаскивается только два поля...Откуда там два поля? Там сейчас всего одно поле - Id. A вот в Person - три поля.
...
Рейтинг: 0 / 0
22.10.2014, 10:31
    #38783731
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Да, я понял уже что это не то что мне нужно))
Откатился назад к моей прежней схеме сущностей.
Суть в том что мне нужно с таблицы Cards записи будет удалять и чтобы при этом записи в Persons оставались!
Запись в базу у меня получается, там ничего сложного, но вот вывод связанных таблиц не удается, либо одна, либо вторая выводятся таблицы, а как все таки связать!? Как то же люди такие связи реализуют... в инете примеры только с одной таблицей
...
Рейтинг: 0 / 0
22.10.2014, 10:37
    #38783744
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
viton-zizu, какие связи-то? Какие у Вас отношения между Карточками и Человеками?

Зачем к примеру Человеков от Карточек наследовать?
...
Рейтинг: 0 / 0
22.10.2014, 10:54
    #38783772
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Связь как я представлял себе 1 к 1.Т.е. одна карточка может соответствовать только одному человеку и наоборот
...
Рейтинг: 0 / 0
22.10.2014, 11:01
    #38783786
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
viton-zizuСвязь как я представлял себе 1 к 1.Т.е. одна карточка может соответствовать только одному человеку и наоборотнадо определиться, где находиться первичный ключ (первичные ключи), тогда будет понятно со связями. Если первичные ключи в каждой таблице свои, то это никак в схему 1:1 не вписывается, можно только ограничение на уникальность поля поставить в таблице, но это будет 1:M
...
Рейтинг: 0 / 0
22.10.2014, 11:10
    #38783800
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
первичные ключи и там и там, следовательно 1:М.
...
Рейтинг: 0 / 0
22.10.2014, 11:12
    #38783803
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Ну раз так, при выборке из Card использовать .Include(n => n.Person)
...
Рейтинг: 0 / 0
22.10.2014, 11:22
    #38783820
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
viton-zizuСвязь как я представлял себе 1 к 1.Т.е. одна карточка может соответствовать только одному человеку...Не факт.
...
Рейтинг: 0 / 0
22.10.2014, 11:24
    #38783823
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
но у одного человека может быть несколько карточек :)
P.S.: от термина "карточка" попахивает DocsVision
...
Рейтинг: 0 / 0
22.10.2014, 12:00
    #38783870
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Shocker.ProНу раз так, при выборке из Card использовать .Include(n => n.Person)
Воот! Сейчас опробую!)
...
Рейтинг: 0 / 0
22.10.2014, 12:05
    #38783878
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
А как записи в таблицу добавлять, я делаю так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        ClubMember personModel = new Person()
                    {
                        Id = 0,
                        Name = txtName.Text.Trim(),
                        Date = System.DateTime.Now,
                        TimeBack = null,
                        Follower = txtFollower.Text.Trim(),
                        Direction = txtDirection.Text.Trim(),
                        WhoGiveAndSerial = txtWhoGiveAndSerial.Text.Trim(),
                    };
                    Card cardModel = new Card()
                    {
                        Id = 0,
                        CardNumber = Convert.ToInt32(nmcCardNumber.Text.Trim()),
  *                      Person = personModel,
                    };


И у меня почему то два раза добавляется в таблицу Person и один раз в Card, стоит только удалить поле с *, так все нормально записывается, но соответственно в это поле ничего не попадает и я не могу зависимости прописать!
...
Рейтинг: 0 / 0
22.10.2014, 12:32
    #38783923
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
создавайте сущности не через new, а через контекст
Persons.Add....
...
Рейтинг: 0 / 0
22.10.2014, 12:38
    #38783933
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Я их вроде так и создаю, это все потом передается вот сюда:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
        public bool Create(Card card)
        {
            using (var context = new MyDbContext())
            {
                context.Cards.Add(card);
                return context.SaveChanges() > 0;
            }
        }


то есть полностью формирую card а потом уже с помощью add добавляю
...
Рейтинг: 0 / 0
22.10.2014, 12:44
    #38783945
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Забавный выходит топик. Вроде как EF должен ускорить разработку, а тут танцы с бубном какие-то выходят.
...
Рейтинг: 0 / 0
22.10.2014, 12:49
    #38783953
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Вот тут:
Код: c#
1.
Person = personModel,


personModel еще не принадлежит контексту
...
Рейтинг: 0 / 0
22.10.2014, 12:51
    #38783958
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
skyANAЗабавный выходит топик. Вроде как EF должен ускорить разработку, а тут танцы с бубном какие-то выходят.для нормальной разработки без EF нужно знать SQL. Для нормальной разработки на EF нужно знать EF и... SQL
...
Рейтинг: 0 / 0
22.10.2014, 13:12
    #38784001
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Shocker.ProskyANAЗабавный выходит топик. Вроде как EF должен ускорить разработку, а тут танцы с бубном какие-то выходят.для нормальной разработки без EF нужно знать SQL.NoSQL набирает обороты, так что не обязательно :)
...
Рейтинг: 0 / 0
23.10.2014, 00:48
    #38784781
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
skyANAЗабавный выходит топик. Вроде как EF должен ускорить разработку, а тут танцы с бубном какие-то выходят.

Топик забавен только тем, что люди не умеют пользоваться поиском. Решение находится на раз-два, это делается ОЧЕНЬ просто и легко. Но надо же развести демагогию на пустом месте
...
Рейтинг: 0 / 0
23.10.2014, 00:53
    #38784784
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
skyANANoSQL набирает обороты, так что не обязательно :)

Реляционные СУБД и NoSQL даже рядом не взаимозаменяющие вещи, хотя позиционируются они почему-то в формате SQL vs. NoSQL.

Это примерно из того же разряда, что «Кошерный гиковый JavaScript набирает обороты и очень скоро похоронит C, C++, Java, C# и прочие убогие языки»
...
Рейтинг: 0 / 0
23.10.2014, 07:10
    #38784839
viton-zizu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь один к одному EF Code First
Эх на мусолили, а по делу то никто и не подсказал!) Проблема была в том, что нужно только один контекст создавать!) и не запихивать лишние поля с Id

У меня такие сложности с освоением code first в связи с тем, что мало статей на русском, в которых бы развернуто все объяснялось. Примеров тоже не много удалось найти, которые находил, были в одну таблицу, т.е. совсем тривиальные. Находил хорошие статьи на английском, но они довольно массивны, а их проблематично читать
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Связь один к одному EF Code First / 25 сообщений из 357, страница 1 из 15
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]