Entity Framework 使用代码优先的多个多对多关系

Entity Framework Multiple Many to Many Relationships using Code First

我有 2 个 类 Foo 和 Bar

public class Foo
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public virtual int Id { get; set; }


        private ICollection<Bar> _bar;
        public virtual ICollection<Bar> Bars
        {
            get { return _bar?? (_bar= new Collection<Bar>()); }
            set { _bar= value; }
        }
    }

酒吧

 public class Bar
        {
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public virtual int Id { get; set; }


            private ICollection<Foo> _foo1;
            public virtual ICollection<Foo> Foos1
            {
                get { return _foo1?? (_foo1= new Collection<Foo>()); }
                set { _foo1= value; }
            }

               private ICollection<Foo> _foo2;
                public virtual ICollection<Foo> Foos2
                {
                    get { return _foo2?? (_foo2= new Collection<Foo>()); }
                    set { _foo2= value; }
                }


            }

然后我使用 Migration 来更新数据库。但是,而不是通常的 table FooBar。 EF 创建 2 tables

Foo
Id,Bar_Id

Bar
Id,Foo_Id,Foo_Id1

这不是我想要的。我想我把 2 个 Foo 集合添加到 Bar 中搞砸了。我现在应该怎么办?

明白了,我需要做两件事来解决这个问题。首先,将另一个 Bar 集合添加到 Foo

 public class Foo
        {
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public virtual int Id { get; set; }


            private ICollection<Bar> _bar;
            public virtual ICollection<Bar> Bars
            {
                get { return _bar?? (_bar= new Collection<Bar>()); }
                set { _bar= value; }
            }

            private ICollection<Bar> _bar2;
            public virtual ICollection<Bar> Bars2
            {
                get { return _bar2?? (_bar2= new Collection<Bar>()); }
                set { _bar2= value; }
            }
        }

其次,使用 InverseProperty 明确告诉 EF 我想要 2 个多对多关系。

 public class Bar
        {
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public virtual int Id { get; set; }


            private ICollection<Foo> _foo1;
            [InverseProperty("Bars")]
            public virtual ICollection<Foo> Foos1
            {
                get { return _foo1?? (_foo1= new Collection<Foo>()); }
                set { _foo1= value; }
            }

               private ICollection<Foo> _foo2;
                [InverseProperty("Bars2")]
                public virtual ICollection<Foo> Foos2
                {
                    get { return _foo2?? (_foo2= new Collection<Foo>()); }
                    set { _foo2= value; }
                }


            }

我现在得到 4 table Foo、Bar、FooBarss 和 FooBar1