2009-12-15 2 views
3

Я создал объекты домена POCO, которые сопоставляются сущностям в модели домена сущности. Все работало нормально до сих пор, когда мне приходится работать с отношениями «многие ко многим».Проблема Entity Framework 4.0 POCO и много-ко многим Проблема

Предположим, у меня есть три стола.
- Блог
- BlogTag
- Tag

Вы можете видеть, что блоги и теги много-ко-многим с мостовым столом, BlogTag, который содержит внешний ключ для обеих таблиц.

У меня также есть соответствующие модели домена:
- Блоги
- BlogsTags
- Метки

Теперь я выбираю список блогов, и я пытаюсь получить доступ к определенному тег из блога ,

myBlog.BlogsTags [0] .tag

BlogTags [0] .TagForeignKey заполняется, но BlogTags [0] .tag является нулевой !!

У меня также включен LazyLoading.

Что я могу делать неправильно?

Спасибо.

Хорошо. Вот несколько исходных кодов.

мой контекст класса

public class MyContext : ObjectContext 
    { 
     public MyContext() : base(Utility.GetConnectionString(...), "containerName") 
     { 
      Blogs = CreateObjectSet<Blog>(); 
      BlogsTags = CreateObjectSet<BlogTag>(); 
      Tags = CreateObjectSet<Tags>(); 

      base.ContextOptions.LazyLoadingEnabled = true; 
     } 

     public ObjectSet<Blog> Blogs { get; private set; } 
     public ObjectSet<BlogTag> BlogsTags { get; private set; } 
     public ObjectSet<Tags> Tags { get; private set; } 
    } 

и мои POCO классы просто есть список объектов, связанных с виртуальным ключевым словом.

+0

Побольше код может помочь диагностировать проблему. Я могу проверить, что многие для многих работают нормально. У меня есть много пользовательских объектов, которые могут иметь много ролей и наоборот. Я использую шаблон репозитория, где у меня есть общий репозиторий с свойством контекста объекта, который возвращает активный контекст EF. Внутри конструктора для поиска контекста EF я установил Lazyloading в true: base.ContextOptions.LazyLoadingEnabled = true; – Jay

ответ

2

BlogTag не должен быть сущностью вообще: это только отношения, они не содержат никаких реальных данных. Если отношения правильно моделируется в базе данных с помощью внешних ключей, дизайнер Entity Model следует понимать, что и устранить BlogTag от концептуальной модели ...


EDIT:

Я не уверен, почему ленивый загрузка не работает, но вы всегда можете использовать Include для загрузки Tag явно:

var myBlog = context.Blogs.Include("BlogTags.Tag").First(b => b.Id = blogId); 
var tag = myBlog.BlogsTags[0].Tag; 
+0

Предположим, что необходим BlogTag (содержит еще несколько столбцов), и он автоматически выяснил, что он имеет другие столбцы и добавляет этот объект в модель. Что для меня не имеет смысла, так это то, что свойство Tag всегда имеет значение null. –

+0

Это не сработает. Так я его и сделал, но это не сработает. Я также понял, что это всегда происходит при переходе от многих к одному. Свойство One всегда равно null. Это звучит как возможная ошибка в бета-версии –

0

Убедитесь, что свойства отношений, которые вы обращаетесь в Entity определяются как «виртуальный» в противном случае они не пройдут автоматически.

У меня была такая же проблема ... например.мой объект пользователя:

public class User : EntityBase 
    { 
     public int UserID { get; set; } 
     public string Username { get; set; } 
     public string Email { get; set; } 
     public virtual List<Role> Roles { get; set; } //VIRTUAL here is KEY! 
} 

Я предполагаю, что ваши должно быть:

public class Blog 
     { 

    public string Owner { get; set; } 
    public string BlogText { get; set; } 
    public virtual List<BlogTag> BlogTags { get; set; } //VIRTUAL here is KEY! 

    } 
+0

Да, они уже вирутулы. Это было необходимо для ленивой загрузки. –

Смежные вопросы