2011-04-05 56 views
0

我目前正在测试EntityFramework 4.1。使用EntityFramework时出现关联问题

我的问题是,我有一个团队类和一个游戏类。

class Team { 
    string Name { get; set; } 
} 

class Game { 
    Team HomeTeam { get; set; } 
    Team AwayTeam { get; set; } 
} 

还没有找到一种方法来映射此。我已经设法使用NHibernate,但没有与EF的运气。任何指针?

回答

1

这是干净的地图我:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Team>().HasKey(t => t.Name); 

     modelBuilder.Entity<Game>().HasKey(
         g => new { g.AwayTeamName, g.HomeTeamName }); 

     modelBuilder.Entity<Game>() 
         .HasRequired(g => g.HomeTeam) 
         .WithMany() 
         .HasForeignKey(g => g.HomeTeamName) 
         .WillCascadeOnDelete(true); 

     modelBuilder.Entity<Game>() 
         .HasRequired(g => g.AwayTeam) 
         .WithMany() 
         .HasForeignKey(g => g.AwayTeamName) 
         .WillCascadeOnDelete(false); 

     base.OnModelCreating(modelBuilder); 
    } 

请注意,你不能既级联PK/FK关系。如果你在NHib中取得成功,你会知道级联两者都会导致循环。


编辑:我想我应该有我的波苏斯:

public class Team 
{ 
    public string Name { get; set; } 
} 

public class Game 
{ 
    internal string HomeTeamName { get; set; } 
    public Team HomeTeam { get; set; } 

    internal string AwayTeamName { get; set; } 
    public Team AwayTeam { get; set; } 
} 

注意,您必须有某种关键的您波苏斯,因此需要对HomeTeamName和AwayTeamName。如果您想将其隐藏在使用代码中,则可以将它们保留在内部。

+0

我在游戏和团队中使用了Id ...并使用了HomeTeamId和AwayTeamId。不过,谢谢。 只有一个问题,通过使用这个我不允许有一个游戏与HomeTeam和AwayTeam相同吗?因为我将HomeTeamName和AwayTeamName设置为游戏的关键字。 – 2011-04-07 19:40:01

+0

在上面的代码中没有任何东西可以阻止你使主队和客队相同。您需要为您的POCO或系统中的其他层添加验证逻辑。 – anon 2011-04-08 02:51:19