Pur*_*ome 15 .net c# ef-code-first entity-framework-4.1
我正在玩新的EF4.1独角兽之爱.
我试图理解不同的方法,我可以使用代码优先以编程方式定义我的几个简单的POCO之间的关系.
如何定义以下=>
Team有0多个Users.(和a User在1 Team)User有0或1 Foo(但是Foo没有属性可以回到a User)User有1UserStuffLad*_*nka 11
这里有你要找的例子:
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<User> 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<User> Users { get; set; }
public DbSet<Foo> Foos { get; set; }
public DbSet<Team> Teams { get; set; }
public DbSet<UserStuff> UserStuff { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasRequired(u => u.Team)
.WithMany(t => t.Users);
modelBuilder.Entity<User>()
.HasOptional(u => u.Foo)
.WithRequired();
modelBuilder.Entity<User>()
.HasRequired(u => u.UserStuff)
.WithRequiredPrincipal();
}
}
Run Code Online (Sandbox Code Playgroud)
让我们介绍一些特定的类来说明解决方案:
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<User> Users { get; set; }
}
public class Company
{
public long ID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用一个帮助器类来使映射类更简洁:
internal abstract class AbstractMappingProvider<T> : IMappingProvider where T : class
{
public EntityTypeConfiguration<T> Map { get; private set; }
public virtual void DefineModel( DbModelBuilder modelBuilder )
{
Map = modelBuilder.Entity<T>();
Map.ToTable( typeof(T).Name );
}
}
Run Code Online (Sandbox Code Playgroud)
现在为映射.让我们先做"1:1"映射.在我的示例中,用户和帐户是1:1相关并共享相同的主键(其中只有一个是标识列,在本例中是Account.ID).
internal class UserMapping : AbstractMappingProvider<User>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
base.DefineModel( modelBuilder );
Map.HasRequired( e => e.Account ).WithRequiredDependent( r => r.User ).WillCascadeOnDelete( true );
}
}
internal class AccountMapping : AbstractMappingProvider<Account>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
base.DefineModel( modelBuilder );
Map.HasRequired( e => e.User ).WithRequiredPrincipal( r => r.Account ).WillCascadeOnDelete( true );
}
}
Run Code Online (Sandbox Code Playgroud)
在以下映射中,我们指定团队拥有(0..n)个用户,而单个用户只有一个团队(必需).我们还指定团队可以拥有一家公司,但公司不公开团队列表.
internal class TeamMapping : AbstractMappingProvider<Team>
{
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<Company>
{
public override void DefineModel( DbModelBuilder modelBuilder )
{
base.DefineModel( modelBuilder );
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!