EF - Свободный API - Многие ко многим - Как добавить связь с существующей записью? - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу создать связь «многие ко многим» с 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>();
    }
}

При первом запуске приложения все работает нормально.Я получаю два foos и один бар, которые связаны друг с другом через объединяющуюся таблицу FooBar.

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

Но во второй раз я получаю два дополнительных foos, что нормально, но я получаю также второй бар-record.

|    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...