Нужно ли настраивать HasXXX и WithYYY на обоих объектах (в отличие только от одного объекта), чтобы установить связь? - PullRequest
1 голос
/ 03 февраля 2012

Предположим, что у меня есть две сущности следующим образом:

class Blog
{
    public Blog()
    {
        Posts = new HashSet<Post>();
    }

    public int Id { get; set; }
    // other properties go here

    public ICollection<Post> Posts { get; set; }
}

class Post
{
    public int Id { get; set; }
    //other properties go here

    public int FKBlogId { get; set; }
    public Blog Blog { get; set; }
}

Поскольку каждое сообщение принадлежит блогу и каждый блог может содержать ноль или более сообщений , отношение один ко многим.

Я не нашел в Интернете статьи, обсуждающей, нужно ли нам настраивать отношения для обеих сущностей следующим образом.

class Context : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasMany(b => b.Posts)
            .WithRequired(p => p.Blog)
            .HasForeignKey(p => p.FKBlogId);


        modelBuilder.Entity<Post>()
            .HasRequired(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.FKBlogId);

    }
}

Должны ли мы настроить отношения на обоих объектах? Другими словами, достаточно ли одного из следующих?

    modelBuilder.Entity<Blog>()
        .HasMany(b => b.Posts)
        .WithRequired(p => p.Blog)
        .HasForeignKey(p => p.FKBlogId);

или

    modelBuilder.Entity<Post>()
        .HasRequired(p => p.Blog)
        .WithMany(b => b.Posts)
        .HasForeignKey(p => p.FKBlogId);

Я проверил, используя один из них, и я не могу заметить никакой разницы между ними. Не могли бы вы дать мне подтверждение правильности моего понимания?

1 Ответ

1 голос
/ 04 февраля 2012

Достаточно одного из двух, что не имеет значения.

Тестовый проект (больше предназначен для Фреда Уилсона), Консольный проект со ссылкой на EntityFramework.dll (4.1 или 4.2):

using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;

namespace EFMappingTest
{
    class Blog
    {
        public Blog()
        {
            Posts = new HashSet<Post>();
        }

        public int Id { get; set; }
        // other properties go here

        public ICollection<Post> Posts { get; set; }
    }

    class Post
    {
        public int Id { get; set; }
        //other properties go here

        public int FKBlogId { get; set; }
        public Blog Blog { get; set; }
    }

    class Context : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // Block 1
            modelBuilder.Entity<Blog>()
                .HasMany(b => b.Posts)
                .WithRequired(p => p.Blog)
                .HasForeignKey(p => p.FKBlogId);
            // End Block 1

            // Block 2
            modelBuilder.Entity<Post>()
                .HasRequired(p => p.Blog)
                .WithMany(b => b.Posts)
                .HasForeignKey(p => p.FKBlogId);
            // End Block 2
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new Context())
            {
                var blogs = context.Blogs
                    .Select(b => new
                    {
                        BlogId = b.Id,
                        Posts = b.Posts.Select(p => new
                        {
                            Id = p.Id
                        })
                    })
                    .ToList();
            }
        }
    }
}

Эта конфигурация, конфигурация при комментировании «Блок 2» и конфигурация при комментировании «Блок 1» - все три конфигурации создают одну и ту же схему базы данных и отношения (кроме имени ограничения FK в базе данных, которое может быть Blog_Posts или Posts_Blog).

Пример запроса работает во всех трех случаях.

...