#c# #entity-framework #navigation-properties
#c# #entity-framework #навигация-свойства
Вопрос:
у меня есть 2 объекта, каждый из которых имеет соответствующий класс c #. Я настроил свойство навигации в таблице A, чтобы оно содержало ссылку на многие элементы в таблице B. Когда я создаю новую таблицу объектом класса, мне нужно иметь возможность создавать коллекцию объектов таблицы B в таблице A. Как мне настроить свойство навигации в таблице класса c #?
МОДЕЛЬ ДАННЫХ: http://bluewolftech.com/mike/mike/datamodel.jpg
Комментарии:
1. Какую версию EF вы используете? Используете ли вы сначала код? У вас есть модель / схема?
2. EF 4.0. да, сначала используя код, и я использую файл edmx для модели данных.
3. Если вы используете EDMX, вы не используете код в первую очередь. Code first — это просто классы POCO, которые украшены атрибутами.
4. Если вы используете EDMX и импортируете таблицы в свою модель, свойства навигации должны создаваться автоматически (ваша база данных должна иметь правильно настроенную ссылочную целостность — внешние ключи).
Ответ №1:
Свойства навигации просты в EF. В приведенном ниже примере показано, как будет выглядеть свойство навигации:
public class Foo
{
public int FooId { get; set; }
public string SomeProperty { get; set; }
public virtual IEnumerable<Bar> Bars { get; set; }
}
Где Foo
представляет TableA и Bar
представляет TableB. Ключевое слово для свойства навигации — virtual, которое по умолчанию включает отложенную загрузку. Предполагается, что вы сначала используете код EF4.1.
Редактировать
С моей точки зрения, это должен быть хороший начальный шаблон для вас:
public class PointOfInterestContext : DbContext
{
public IDbSet<PointOfInterest> PointOfInterest { get; set; }
public IDbSet<POITag> POITag { get; set; }
public IDbSet<Tag> Tag { get; set; }
public override OnModelCreating(DbModelBuilder modelBuilder)
{
// custom mappings go here
base.OnModelCreating(modelBuilder)
}
}
public class PointOfInterest
{
// properties
public int Id { get; set; }
public string Title { get; set; }
// etc...
// navigation properties
public virtual IEnumerable<POITag> POITags { get; set; }
}
public class POITag
{
// properties
public int Id { get; set;}
public int PointOfInterestId { get; set; }
public int TagId { get; set; }
// navigation properties
public virtual PointOfInterest PointOfInterest { get; set; }
public virtual Tag Tag { get; set; }
}
public class Tag
{
// properties
public int Id { get; set; }
public string TagName { get; set; }
// etc...
// navigation properties
public virtual IEnumerable<POITags> POITags { get; set; }
}
Затем вы должны реализовать другую логику в своих бизнес-объектах. Предполагается, что объекты должны быть легкими и, самое большее, должны иметь атрибуты данных. Однако я предпочитаю использовать плавные сопоставления через OnModelCreating.
Вот несколько хороших ссылок:
MSDN — EF 4.1 Code First
Code First Учебное пособие
Комментарии:
1. я получаю сообщение «Требуемое свойство ‘Foo’ не существует для типа ‘MyNamespace.Bar’. В классе Bar у меня есть свойство <code> общедоступный виртуальный Foo Foo { get; set;}</code> Для модели объекта в файле edmx есть свойство навигации для объекта Bar, в котором указано, что он является экземпляром Foo . Вы знаете, что это может быть за ошибка?
2. Как это поможет, если OP использует EDMX?
3. @LadislavMrnka Я предположил, что он сначала использовал код, поскольку EDMX заботится о свойствах навигации.
4. классы c # записываются первыми. Затем я создаю объект в файле edmx. У меня отключена автоматическая генерация кода, потому что мне нужно расширить базовые классы.
5. @MBU почему вы сначала объединяете код и модель? Я бы предложил сначала код, если вы ищете гибкость.