Entity Framework 4.0 POCO и проблема «многие ко многим» - PullRequest
3 голосов
/ 15 декабря 2009

Я создал объекты домена POCO, которые отображаются на объекты в модели домена объекта. До сих пор все работало нормально, когда мне приходилось работать с отношениями «многие ко многим».

Допустим, у меня есть три стола.
- Блог
- BlogTag
- Метка

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

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

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

myBlog.BlogsTags [0] .tag

BlogTags [0] .TagForeignKey заполнен, но BlogTags [0] .Tag равен null !!

У меня также включена функция 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 просто есть список связанных объектов с ключевым словом virtual.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

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 голосов
/ 17 декабря 2009

Убедитесь, что свойства отношений, к которым вы обращаетесь в 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!

    }
...