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
我有 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