如何在Entity Framework 4.1的Code-First Fluent API中以编程方式定义关系
我正在玩新的EF4.1独角兽之爱。
我试图理解不同的方法,我可以使用代码优先以编程方式定义我在几个简单的POCO之间的关系。
如何定义以下=>
- 1个
Team
拥有0个User
。 (并且User
在1个Team
) - 1
User
有0或1个Foo
(但Foo
没有属性返回给User
) - 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 ); } }
希望这可以帮助!