实体框架 - 代码优先 - 具有两个导航属性到同一个类/表的类

时间:2011-08-05 04:09:17

标签: asp.net-mvc vb.net entity-framework ef-code-first

请原谅我这是否重复,因为我不确定如何构建问题/搜索。

我有两个MS SQL表,匹配和团队。

Match
- matchId (PK int)
- homeTeamId (FK int)
- awayTeamId (FK int)

Team
- teamId (PK int)
- Name (nvarchar)

我还有两个vb.net类“匹配”和“团队”。

Public Class Match
    Public Property MatchId As Integer
    Public Property HomeTeamId As Integer
    Public Property AwayTeamId As Integer
    Public Overridable Property AwayTeam As Team
    Public Overridable Property HomeTeam As Team
End Class

Public Class Team
    Public Property TeamId As Integer
    Public Property Name As String
End Class

我设置了两个关系,Team.TeamId链接到Match.HomeTeamId和Match.AwayTeamId。

当我运行我的应用程序时,我得到一个说

的异常(innerException)
  

{“无效的列名'AwayTeam_TeamId'。

     

无效的列名称'HomeTeam_TeamId'。

     

无效的列名称'Team_TeamId'。“}

我尝试使用流畅的API来映射关系,但我担心我不确定如何设置它以便我可以让两个属性正确映射到Match中的属性。

使用Fluent API,我可以映射一个属性(HomeTeam),同时注释掉“Match.AwayTeam”属性,但不是两者都有。

modelBuilder.Entity(Of Match)().HasRequired(Function(m) m.HomeTeam).WithMany(Function(t) t.Matches).HasForeignKey(Function(m) m.HomeTeamId)

我该如何设置它以使Match类包含HomeTeam和AwayTeam属性?

更新

我设法在我的上下文的'OnModelCreating'方法中使用以下代码。

感谢@Slauma对'WithMany'的更正。

modelBuilder.Entity(Of Match).HasRequired(Function(m) m.HomeTeam).WithMany().Map(Function(t) t.MapKey("HomeTeamId"))
modelBuilder.Entity(Of Match).HasRequired(Function(m) m.AwayTeam).WithMany().Map(Function(t) t.MapKey("AwayTeamId"))

3 个答案:

答案 0 :(得分:0)

如果您正在使用Entity Framework,它将为您处理映射,您不需要创建自己的外键,因此只需从Match类中省略HomeTeamId和AwayTeamId属性。此外,AwayTeam和HomeTeam属性需要是ICollection对象。

Public Class Match
Public Property MatchId As Integer 
Public Overridable Property  AwayTeam As ICollection<Team>
Public Overridable Property HomeTeam As ICollection<Team>

结束班

然后,当您创建Match对象时,您只需将Team对象应用于AwayTeam和HomeTeam属性即可。 但是不确定错误消息,您需要提供有关触发它的操作的更多详细信息。

答案 1 :(得分:0)

您是否为EF创建了一个模型?您想要创建一个继承自DbContext的自定义上下文类,并且应该有两个集合。

在C#中

public class  ProjectXEFDbContext:DbContext
{
    public DbSet<Match> MatchCollection { get; set; }
    public DbSet<Team> TeamCollection { get; set; }


protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MatchConfiguration());
        modelBuilder.Configurations.Add(new TeamConfiguration());



        base.OnModelCreating(modelBuilder);
    }

}

public class MatchConfiguration

{

public MatchConfiguration()
    {
        Map(s =>
                {
                    s.Properties(b => new { b.Address });
                    s.ToTable("Address");
                }
            );
        Map(s =>
                {
                    s.Properties(b => new { b.ContactDetail });
                    s.ToTable("ContactDetail");
                }
            );

    }

}

答案 2 :(得分:0)

讨厌回答我自己的问题,但我设法在我的上下文的'OnModelCreating'方法中使用以下代码。

modelBuilder.Entity(Of Match).HasRequired(Function(m) m.HomeTeam).WithMany().Map(Function(t) t.MapKey("HomeTeamId"))
modelBuilder.Entity(Of Match).HasRequired(Function(m) m.AwayTeam).WithMany().Map(Function(t) t.MapKey("AwayTeamId"))

我假设我之前遇到的困难是由于EF无法将'HomeTeam'和'AwayTeam'属性映射到'Team'表,因为属性名称与对象名称't​​eam'不够匹配。我认为数据库关系会提供我需要的映射。

我对此不以为然吗?

有更好的方法吗?