Реализовать свойство навигации в классе c #

#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 почему вы сначала объединяете код и модель? Я бы предложил сначала код, если вы ищете гибкость.