20

Давайте предположим, что мы имеем такую ​​ситуацию:Entity Framework (базы данных-первых) несколько отношений к соглашениям об именовании же управляющей таблицей

Таблицы в базе:

Country (id, country_name), Person (id, login), CountryManager (id_country, id_person), CountryStakeholder (id_country, id_person)

Если мы должны были создать модель из базы данных, с помощью Entity Framework Database-первых, в VS мы имеем класс как это:

class Country { 

int id; 
string country_name; 

virtual ICollection<Person> Person1; // Navigation Properties 
virtual ICollection<Person> Person2; // ---------||---------- 

} 

Я упростил код, но, надеюсь, вы поняли.

Похоже, что когда Entity Framework имеет дело с внешними ключами, он создает общие свойства навигации. Есть ли возможность управлять созданием свойств навигации по имени? Person1, Person2 не очень объяснительный, к сожалению.

+1

Лично я предпочитаю использовать методологию Database-First. И у меня был большой успех, используя его. Однако я применяю строгое соглашение об именах в своих базах данных. У меня есть скрипт утилиты, который будет пульсировать через базу данных и переименовывать мои внешние ключи в соответствии с моим соглашением об именах. К тому времени, как FK попадают в EDMX, их имена действительно имеют смысл. Поэтому EDMX имеет смысл, и T4 получают код, который имеет смысл. –

+1

Не могли бы вы поделиться сценарием? Я думаю, что это был бы самый близкий вариант решения –

+1

@AdrianK. Вы нашли решение для этого? – Lijo

ответ

1

В VS вы можете сделать это с помощью графического интерфейса.

Если вы покажете Model Browser затем перейдите вниз по дереву к:

YourEntityModel> Entity Types> Страна

затем щелкните правой кнопкой мыши на «PERSON1» свойство навигации и выберите «Свойства» вы можете затем изменить имя имя свойства навигации к тому, что вам нравится:

enter image description here

Просто измените имя, сохранить изменения и ваши сделали ...

(На самом деле есть много способов, чтобы получить в окне свойств навигации свойств - вы сп правой кнопкой мыши на нем в схеме модели тоже)

+3

Я пытаюсь избежать этого метода, потому что, если я снова создам модель из базы данных, она перезапишет свойство 'Name', которое вы здесь указали –

0

Из записи «Working with Inverse Navigation Properties» из книги «Programming Entity Framework: Code First»:

Вы можете добавить конфигурацию (используя аннотации данных или Fluent API) , чтобы представить эту информацию строителю модели. С данными Аннотации, вы будете использовать аннотацию под названием InverseProperty. С API-интерфейсом Fluent вы будете использовать комбинацию методов Has/With to , чтобы указать правильные концы этих отношений.

Вы можете разместить аннотации на обоих концах отношений (или с обоих концов, если хотите). Мы привяжем их к свойствам навигации в классе жилья (пример 4-10). InverseProperty Data Аннотации необходимо указать имя соответствующего свойства навигации в связанного класса в качестве его параметра.

Пример:

[InverseProperty("PrimaryContactFor")] 
public Person PrimaryContact { get; set; } 

[InverseProperty("SecondaryContactFor")] 
public Person SecondaryContact { get; set; } 
+0

Является ли это доказательством обновления? Я имею в виду, если я добавлю столбец в таблицу и регенерирую модель, это будет перезаписано? –

+2

Я думаю, что OP использует Database First? Он говорит: «Если бы нам пришлось создать модель из базы данных в VS ...» –

+1

Я боюсь, что нет; это один из недостатков использования базы данных First-approach. – BCdotWEB

0

Я рекомендую использовать https://visualstudiogallery.msdn.microsoft.com/ee4fcff9-0c4c-4179-afd9-7a2fb90f5838

Это обеспечивает большую гибкость, чем любое поколение базы данных, что я видел. Я все еще работаю над решением моей собственной проблемы, но это выглядит довольно многообещающе. Но, в отличие от генерации кода по умолчанию, которую предоставляет EF, вы можете настроить отображение.

Как и во всех примерах, которые я видел при переименовании свойств навигации, этого будет недостаточно, потому что EF по-прежнему необходимо сопоставить, чтобы использовать эти свойства навигации (вы могли бы взломать его, хотя и ваш User2 указывает на ModifiedByUser, например).