entity framework代码优先 – 具有连接/链接表的一对多

是否可以与Code First创建一对多关系,在它们之间使用链接/连接表?

public class Foo { public int FooId { get; set; } // ... public int? BarId { get; set; } public virtual Bar Bar { get; set; } } public class Bar { public int BarId { get; set; } // ... public virtual ICollection Foos { get; set; } } 

我希望这个映射如下:

 TABLE Foo FooId INT PRIMARY KEY ... TABLE Bar BarId INT PRIMARY KEY TABLE FooBar FooId INT PRIMARY KEY / FOREIGN KEY BarId INT FOREIGN KEY 

有了这个,我就有能力确保Foo只有一个Bar,但是Bar可以被许多不同的Foo重用。

entity framework可以实现吗? 我宁愿不必将密钥放在Foo本身,因为我不想要一个可以为空的外键。 如果可能,请使用Fluent API而不是数据注释提供示例。

您可以使用实体拆分来实现此目的

 public class Foo { public int FooId { get; set; } public string Name { get; set; } public int BarId { get; set; } public virtual Bar Bar { get; set; } } 

然后在您的自定义DbContext类中

  protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().HasKey(f => f.FooId); modelBuilder.Entity() .Map(m => { m.Properties(b => new {b.Name}); m.ToTable("Foo"); }) .Map(m => { m.Properties(b => new {b.BarId}); m.ToTable("FooBar"); }); modelBuilder.Entity().HasRequired(f => f.Bar) .WithMany(b => b.Foos) .HasForeignKey(f => f.BarId); modelBuilder.Entity().HasKey(b => b.BarId); modelBuilder.Entity().ToTable("Bar"); } 

BarId列将在FooBar表中创建为非空列。 您可以在ADO.NET Entity Framework 4.1中查看Code First以获取更多详细信息