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