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以获取更多详细信息