我想与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