powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF CodeFirst задать составной первичный ключ
31 сообщений из 31, показаны все 2 страниц
EF CodeFirst задать составной первичный ключ
    #37823948
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Имеется 2 типа объектов.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class A
{
   public int Id { get; set; }
   public virtual ICollection<B> BList {get;set;}
}

public class B
{
   public int AId {get;set;}
   public int LocalIndex {get;set;}
}



как задать для класса B поля AId и LocalIndex первичным составным ключем с помощь аттирбутов? (FluentApi пока не смотрел)
[Key] выдает ошибочку
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37823961
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public class B
{
   [Key, Column(Order = 1)]
   public int AId {get;set;}

   [Key, Column(Order = 2)]
   public int LocalIndex {get;set;}
}
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37823991
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К, спасибо.

Еще такой тогда вопрос. Если мы в В добавляем ссылку на А, то в БД генерируется еще одно поле A_Id, кторое я и так указал явно(для задания ключа). Как это обойти?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class A
{
   public int Id { get; set; }
   public virtual ICollection<B> BList {get;set;}
}

public class B
{
   [Key, Column(Order = 1)]
   public int AId {get;set;}
   [Key, Column(Order = 2)]
   public int LocalIndex {get;set;}
   public virtual A A {get;set;}
}




И еще появился другой немного вопрос, если позволите )

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class A
{
   public int Id { get; set; }
}

public class B
{
   public virtual A A1 {get;set;}
   public virtual A A2 {get;set;}
}



тут он выдаст ошибку (так как А1 и А2 не попадают под соглашения для навигации). Но при этом аттрибут RelativeTo почему то отсутствует... (версия 4.3.1). Тут только через FluentApi делать?
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824022
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky DragonАлексей К, спасибо.

Еще такой тогда вопрос. Если мы в В добавляем ссылку на А, то в БД генерируется еще одно поле A_Id, кторое я и так указал явно(для задания ключа). Как это обойти?Я модель генерирую по БД а не наоборот. Чего и Вам советую. :-)

Впрочем, тут всё неплохо описано.

Sky Dragonтут он выдаст ошибку (так как А1 и А2 не попадают под соглашения для навигации). Но при этом аттрибут RelativeTo почему то отсутствует... (версия 4.3.1). Тут только через FluentApi делать? Я не знаю что за атрибут RelativeTo. Для ассоциаций использую ForeignKeyAttribute и InversePropertyAttribute.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824033
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

А как же все вопросы о DDD? :)
И если объекты будут в отдельной сборке, то и TDD+моки )

а генерировать по БД мне не понравилось. Там куча всего лишнего в объектах. Ну и то, что они вместе с доступом к бд в одной куче лежат.

А вообще, БД то тоже есть. А теперь хочется написать объекты простыми(слово POCO мне не очень нравится). А потом с помощью EF это все связать...
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824064
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragonа генерировать по БД мне не понравилось. Там куча всего лишнего в объектах.Напишите свой кодогенератор. Чтобы генерировалось как Вам нравится.
Sky DragonА вообще, БД то тоже есть. А теперь хочется написать объекты простыми(слово POCO мне не очень нравится). А потом с помощью EF это все связать...Бестолковая двойная работа. С другой стороны, если БД маленькая - можно и вручную.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824068
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky DragonА как же все вопросы о DDD?Отношусь ко всему этому как к типизированой обёртке SQL, не более того.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824072
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky DragonИ если объекты будут в отдельной сборке, то и TDD+моки )Организуйте БД с тестовыми данными, и никакие моки не потребуются.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824084
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А полноценную БД Вы никогда по модели не сгенерируете. Массу моментов в любом случае придётся прописывать вручную. Как минимум - индексы.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824095
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как все печально...
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37824390
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragonкак все печально...Почему печально?
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37825549
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

ну просто Ваши ответы не внушают оптимизма )

а InverseProperty не помог. Так как в классе A нужна только одна ссылка на B. А для InverseProperty надо две, причем одна из них будет всегда нулевой.

сам EntityFramework так и генерирует кстати, по 2 ссылки.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37825874
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragonну просто Ваши ответы не внушают оптимизма )Ну не знаю. Меня EF Code First очень радует. :-)
Sky DragonТак как в классе A нужна только одна ссылка на B. А для InverseProperty надо две, причем одна из них будет всегда нулевой.Мне казалось InverseProperty необязателен.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37825945
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КНу не знаю. Меня EF Code First очень радует. :-)
но при этом:

Алексей КЯ модель генерирую по БД а не наоборот. Чего и Вам советую. :-)

:)

просто если оставлять сгенерированные объекты EF, то придется делать еще типа дополнительных DTO, которые в принципе просто копия их же.



Алексей КМне казалось InverseProperty необязателен.

А как тогда задать аттрибутами:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class A
{
   public int Id { get; set; }
   public virtual B A;
}

public class B
{
   public virtual A A1 {get;set;}
   public virtual A A2 {get;set;}
}


чтобы он правильно БД сгенерировал?
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37826126
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragonпросто если оставлять сгенерированные объекты EF, то придется делать еще типа дополнительных DTO, которые в принципе просто копия их же.Зачем? Почему бы не использовать сгенерированные классы в Вашей бизнес-логике?
Sky DragonА как тогда задать аттрибутами:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class A
{
   public int Id { get; set; }
   public virtual B A;
}

public class B
{
   public virtual A A1 {get;set;}
   public virtual A A2 {get;set;}
}


чтобы он правильно БД сгенерировал?Я БД не генерировал, возможно я действительно чего-то не знаю, и от моих советов становится только хуже. :-)
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827162
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

Сгенерированные классы вместе с собой таксают и весь слой доступа к БД. То есть например, чтобы сделать модель представленяи объектов, по модели, сгенерированной EF, нам надо в представление передать всю модель. И получается, что из представления мы имеем полынй доступ к слою досутпа(простите за тавтологию) к данным. А это не есть хорошо.

А если иметь отдельные объекты(типа DTO) то их ведь можно по всем уровням гонять, не беспокоясь о том, что кто-то будет знать лишнего.

Ну это мое субъективное некомпетентное(полгода опыта работы программистом :)) ) мнение.

А по поводу второ вопроса, скажу чуть по конктрнее.
Имеется точка входа. На нем есть входной и выходной считыватель. Ну, типа карточек.
то есть в бд вход имеет 2 поля(InReaderId и OutReaderId). Ну и они ссылаются на одну табличку ридеров.
Ну и в объектах соответсенно хочется иметь: во входе - 2 ссылочки на вх и вых считыватели. А в считывателе - ОДНУ ссылку на вход, на котором она висит. И вот что генерирует EF: картинка в приложенном файле.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827167
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот и получаеются инверсные свойства... Entrance - InReader и Entrance1 - OutReader. А это как то вообще гадость)
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827283
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky DragonВот и получаеются инверсные свойства... Entrance - InReader и Entrance1 - OutReader. А это как то вообще гадость)Ну может их можно переименовать вручную?
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827285
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дизайнере.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827288
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

переименовать не проблема )

Пороблема в том, что у ридера 2(!) свойства входа. А реально - только одно(ридер не может висеть одновременно на двух входах, и не может одновременно висеть и на входе и на выходе одной точки входа). Поэтому, как я полагаю, одно из них, всегда будет нулевым. И придется потом везде делать сравнения, если это не ноль, тогда берем это...
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827321
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky DragonАлексей К,

переименовать не проблема )

Пороблема в том, что у ридера 2(!) свойства входа. А реально - только одно(ридер не может висеть одновременно на двух входах, и не может одновременно висеть и на входе и на выходе одной точки входа). Поэтому, как я полагаю, одно из них, всегда будет нулевым. И придется потом везде делать сравнения, если это не ноль, тогда берем это...Ну если так не нравится, значит структуру данных надо менять. EF тут вообще непричём.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827337
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

но эти свойства навигации же EF генерирует))

А более лучшей структры БД пока не придумали...
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827359
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragonно эти свойства навигации же EF генерирует))Ну он же их по БД генерирует а не с потолка берёт. :-)
Sky DragonА более лучшей структры БД пока не придумали...Вместо 2-х полей InReaderId и OutReaderId переходная таблица вроде:

ReaderID int not null,
EntranceID int not null,
EntranceType int not null /*1 - In, 2 - Out*/
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827455
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей К,

идея хорошая, еще над ней поразмыслю
но... получается связь многие ко многим.
и добавляется еще один объект-связка, с которым тоже придется что-то дополнительно делать...
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827465
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky DragonАлексей К,

идея хорошая, еще над ней поразмыслю
но... получается связь многие ко многим.
и добавляется еще один объект-связка, с которым тоже придется что-то дополнительно делать...Но зато решается описанная выше проблема. Это решение, как и все остальные, со своими плюсами и минусами. :-)
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827517
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да уж, лучше б я в футболисты подался)))
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827543
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragonда уж, лучше б я в футболисты подался)))Жизнь футболиста скучна и неинтересна. :-)
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827625
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Когда что то не получается написать самому в CF юзую вот это
Entity Framework Power Tools Beta 2
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37827739
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DezaАлексей К,

Когда что то не получается написать самому в CF юзую вот это
Entity Framework Power Tools Beta 2 Видел. Мне оно никчему.
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37828114
Deza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КDezaАлексей К,

Когда что то не получается написать самому в CF юзую вот это
Entity Framework Power Tools Beta 2 Видел. Мне оно никчему.
ой промахнулся по сообщению, то было для Sky Dragon
...
Рейтинг: 0 / 0
EF CodeFirst задать составной первичный ключ
    #37828752
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deza,

ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ 09.04.2012

как раз в мой день рождения)

спасибо, посмотрю
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF CodeFirst задать составной первичный ключ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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