EF-流利的API-多对多-如何向现有记录添加关系?

时间:2018-12-28 12:46:37

标签: api reference static record fluent

我想与Fluent-API建立多对多关系并将实体添加到数据库中。

到目前为止,这是我的代码:

class Program
{
    static void Main(string[] args)
    {
        Bar bar = new Bar
        {
            Id = 1,
            Street = "BarStreet"
        };

        Foo foo1 = new Foo
        {

            Name = "FooName1",
            Bars = { bar },
        };

        Foo foo2 = new Foo
        {
            Name = "FooName2",
            Bars = { bar },
        };


        using (SandBoxModelContext db = new SandBoxModelContext())
        {
            Bar existingBar = db.Bar.FirstOrDefault(b => b.Id == bar.Id);
            if (existingBar != null)
            {
                foo1.Bars.ToList()[0] = existingBar;
                foo1.Bars.ToList()[0] = existingBar;
            }

            db.Foo.Add(foo1);
            db.Foo.Add(foo2);
            db.SaveChanges();
        }

        Console.ReadLine();
    }
}

class Foo
{
    internal int Id { get; set; }
    internal string Name { get; set; }

    internal virtual ICollection<Bar> Bars { get; set; }

    public Foo()
    {
        Bars = new HashSet<Bar>();
    }
}

class Bar
{
    internal int Id { get; set; }
    internal string Street { get; set; }

    internal virtual ICollection<Foo> Foos { get; set; }

    public Bar()
    {
        Foos = new HashSet<Foo>();
    }
}

当我第一次运行该应用程序时,一切正常。我得到两个foo和一个bar,它们通过联接表FooBar相互关联。

|    Foo    | |    Bar      | |  FooBar   |
|Id|  Name  | |Id| Street   | |FooId|BarId|
|-----------| |-------------| |-----------|
| 1|FooName1| | 1|BarStreet1| |  1  |  1  |
| 2|FooName2|                 |  2  |  1  |

但是第二次我又得到两个foos,这很好,但是我也获得了第二个条形记录。

|    Foo    | |    Bar      | |  FooBar   |
|Id|  Name  | |Id| Street   | |FooId|BarId|
|-----------| |-------------| |-----------|
| 1|FooName1| | 1|BarStreet1| |  1  |  1  |
| 2|FooName2| | 2|BarStreet1| |  2  |  1  |
| 3|FooName1|                 |  3  |  2  |
| 4|FooName2|                 |  4  |  2  |

如何将关系添加到现有记录? 在这种情况下,我想添加新的Foos并将它们连接到现有的Bar记录。

这是我的FluentApi配置:

#region Foo
modelBuilder.Entity<Foo>()
    .Property(f => f.Id)
    .HasColumnType("int");
modelBuilder.Entity<Foo>()
    .HasKey(f => f.Id);
modelBuilder.Entity<Foo>()
    .Property(f => f.Name)
    .HasColumnType("nvarchar(max)");
#endregion

//many-to-many configuration
modelBuilder.Entity<Foo>()
    .HasMany(f => f.Bars)
    .WithMany(b => b.Foos)
    .Map(fb =>
    {
        fb.MapLeftKey("FooId");
        fb.MapRightKey("BarId");
        fb.ToTable("FooBar");
    });


#region Bar
modelBuilder.Entity<Bar>()
    .Property(f => f.Id)
    .HasColumnType("int");
modelBuilder.Entity<Bar>()
    .HasKey(f => f.Id);
modelBuilder.Entity<Bar>()
    .Property(f => f.Street)
    .HasColumnType("nvarchar(max)");
#endregion

0 个答案:

没有答案