如何在Entity Framework 4.1的Code-First Fluent API中以编程方式定义关系

我正在玩新的EF4.1独角兽之爱。

我试图理解不同的方法,我可以使用代码优先编程方式定义我在几个简单的POCO之间的关系。

如何定义以下=>

  1. 1个Team拥有0个User 。 (并且User在1个Team
  2. 1 User有0或1个Foo (但Foo没有属性返回给User
  3. 1 User有1个UserStuff

这里有你要找的例子:

 public class User { public int Id { get; set; } ... public Foo Foo { get; set; } public Team Team { get; set; } public UserStuff UserStuff { get; set; } } public class Team { public int Id { get; set; } ... public ICollection Users { get; set; } } public class Foo { public int Id { get; set; } ... } public class UserStuff { public int Id { get; set; } ... } public class Context : DbContext { public DbSet Users { get; set; } public DbSet Foos { get; set; } public DbSet Teams { get; set; } public DbSet UserStuff { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(u => u.Team) .WithMany(t => t.Users); modelBuilder.Entity() .HasOptional(u => u.Foo) .WithRequired(); modelBuilder.Entity() .HasRequired(u => u.UserStuff) .WithRequiredPrincipal(); } } 

让我们介绍一些特定的类来说明解决方案:

 public class Account { public long ID { get; set; } public virtual User User { get; set; } } public class User { public long ID { get; set; } public virtual Account Account { get; set; } public virtual Team Team { get; set; } } public class Team { public long ID { get; set; } public long CompanyID { get; set; } public virtual Company Company { get; set; } public virtual ICollection Users { get; set; } } public class Company { public long ID { get; set; } } 

我正在使用一个帮助器类来使映射类更简洁:

 internal abstract class AbstractMappingProvider : IMappingProvider where T : class { public EntityTypeConfiguration Map { get; private set; } public virtual void DefineModel( DbModelBuilder modelBuilder ) { Map = modelBuilder.Entity(); Map.ToTable( typeof(T).Name ); } } 

现在为映射。 让我们先做“1:1”映射。 在我的示例中,用户和帐户是1:1相关并共享相同的主键(其中只有一个是标识列,在本例中是Account.ID)。

 internal class UserMapping : AbstractMappingProvider { public override void DefineModel( DbModelBuilder modelBuilder ) { base.DefineModel( modelBuilder ); Map.HasRequired( e => e.Account ).WithRequiredDependent( r => r.User ).WillCascadeOnDelete( true ); } } internal class AccountMapping : AbstractMappingProvider { public override void DefineModel( DbModelBuilder modelBuilder ) { base.DefineModel( modelBuilder ); Map.HasRequired( e => e.User ).WithRequiredPrincipal( r => r.Account ).WillCascadeOnDelete( true ); } } 

在以下映射中,我们指定团队拥有(0..n)个用户,而单个用户只有一个团队(必需)。 我们还指定团队可以拥有一家公司,但公司不公开团队列表。

 internal class TeamMapping : AbstractMappingProvider { public override void DefineModel( DbModelBuilder modelBuilder ) { base.DefineModel( modelBuilder ); Map.HasOptional( e => e.Company ).WithMany().HasForeignKey( e => e.CompanyID ); Map.HasMany( e => e.Users ).WithRequired( r => r.Team ); } } internal class CompanyMapping : AbstractMappingProvider { public override void DefineModel( DbModelBuilder modelBuilder ) { base.DefineModel( modelBuilder ); } } 

希望这可以帮助!