C# 无法自动绑定导航属性';玩家';关于实体类型';数据组';对于源实体集';团队';

C# 无法自动绑定导航属性';玩家';关于实体类型';数据组';对于源实体集';团队';,c#,entity-framework,C#,Entity Framework,我首先使用的是EF6代码 我有以下课程: public class Player { [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int Id { get; set; } [Required, MinLength(2, ErrorMessage = "Player name must be at least 2 characters length")] public

我首先使用的是EF6代码

我有以下课程:

public class Player
{
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MinLength(2, ErrorMessage = "Player name must be at least 2 characters length")]
    public string Name { get; set; }

    [Required]
    public int TeamClubId { get; set; }

    [ForeignKey("TeamClubId")]
    public virtual Team Club { get; set; }

    [Required]
    public int TeamNationalId { get; set; }

    [ForeignKey("TeamNationalId")]
    public virtual Team National { get; set; }

}

public class Team
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MinLength(2, ErrorMessage = "Team name must be at least 2 characters length")]
    public string Name { get; set; }

    [Required]
    public TeamType Type { get; set; }

    public virtual ICollection<Player> Players { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}


public class Tournament
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MinLength(2, ErrorMessage = "Tournament name must be at least 2 characters length")]
    public string Name { get; set; }

    public int Year { get; set; }

    public DateTime StartDate { get; set; }

    public DateTime EndDate { get; set; }

    public ICollection<Match> Matches { get; set; }

}
公共类播放器
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[必需,MinLength(2,ErrorMessage=“玩家名称长度必须至少为2个字符”)]
公共字符串名称{get;set;}
[必需]
public int TeamClubId{get;set;}
[ForeignKey(“TeamClubId”)]
公共虚拟团队俱乐部{get;set;}
[必需]
public int teamnational{get;set;}
[ForeignKey(“TeamNationalId”)]
国家公共虚拟团队{get;set;}
}
公开课小组
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[必需,最小长度(2,ErrorMessage=“团队名称长度必须至少为2个字符”)]
公共字符串名称{get;set;}
[必需]
公共团队类型类型{get;set;}
公共虚拟ICollection播放器{get;set;}
公共虚拟ICollection匹配{get;set;}
}
公开课比赛
{
[数据库生成(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
[必需,MinLength(2,ErrorMessage=“锦标赛名称长度必须至少为2个字符”)]
公共字符串名称{get;set;}
公共整数年{get;set;}
公共日期时间起始日期{get;set;}
公共日期时间结束日期{get;set;}
公共ICollection匹配{get;set;}
}
在DBContext类中,我有:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    //player - national team relations
    modelBuilder.Entity<Player>()
        .HasRequired<Team>(p => p.National)
        .WithMany()
        .WillCascadeOnDelete(false);

    //player - club team relations
    modelBuilder.Entity<Player>()
        .HasRequired<Team>(p => p.Club)
        .WithMany()
        .WillCascadeOnDelete(false);

    //match - home team relations
    modelBuilder.Entity<Match>()
        .HasRequired<Team>(p => p.HomeTeam)
        .WithMany()
        .WillCascadeOnDelete(false);

    //match - away team relations
    modelBuilder.Entity<Match>()
        .HasRequired<Team>(p => p.AwayTeam)
        .WithMany()
        .WillCascadeOnDelete(false);

    base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//球员与国家队的关系
modelBuilder.Entity()
.HasRequired(p=>p.National)
.有很多
.WillCascadeOnDelete(假);
//球员-俱乐部团队关系
modelBuilder.Entity()
.has必需(p=>p.Club)
.有很多
.WillCascadeOnDelete(假);
//主队关系
modelBuilder.Entity()
.HasRequired(p=>p.HomeTeam)
.有很多
.WillCascadeOnDelete(假);
//客场球队关系
modelBuilder.Entity()
.HasRequired(p=>p.AwayTeam)
.有很多
.WillCascadeOnDelete(假);
基于模型创建(modelBuilder);
}
尝试通过OData连接时,我遇到以下错误:

无法自动绑定源实体集“Teams”的实体类型“Data.Team”上的导航属性“Players”,因为存在两个或多个匹配的目标实体集。匹配的实体集是:玩家、锦标赛。

[NotSupportedException:无法自动绑定导航 源实体的实体类型“Data.Team”上的属性“Players” 设置“团队”,因为存在两个或多个匹配的目标实体集。 匹配的实体集是:玩家、锦标赛。]
System.Web.Http.OData.Builder.EntitySetConfiguration.FindBinding(NavigationPropertyConfiguration 导航配置,布尔自动创建)+736
System.Web.Http.OData.Builder.EdmModelHelperMethods.AddNavigationBindings(EntitySetConfiguration 配置,EdmentySet entitySet,EntitySetLinkBuilderName 链接生成器,ODataModelBuilder生成器,字典
2 edmTypeMap,
字典
2 EdmentySetMap)+391
System.Web.Http.OData.Builder.EdmModelHelperMethods.AddEntitySets(EdmModel 模型、ODataModelBuilder生成器、EdmEntityContainer容器、, 字典
2edmtypemap)+635
System.Web.Http.OData.Builder.EdmModelHelperMethods.BuildEdmModel(ODataModelBuilder 建筑商)+200
System.Web.Http.OData.Builder.ODataConventionModelBuilder.GetEdmModel() +664 ODataAPI.WebApiConfig.Register(HttpConfiguration config)+221 System.Web.Http.GlobalConfiguration.Configure(Action
1 配置回调)+65

[HttpException(0x80004005):无法自动绑定导航 源实体的实体类型“Data.Team”上的属性“Players” 设置“团队”,因为存在两个或多个匹配的目标实体集。 匹配的实体集是:玩家、锦标赛。]
System.Web.HttpApplicationFactory.EnsureStartCalledForIntegratedMode(HttpContext 上下文,HttpApplication应用程序)+12582201
System.Web.HttpApplication.registereventsubscriptionswithis(IntPtr appContext、HttpContext、MethodInfo[]处理程序)+175
System.Web.HttpApplication.InitSpecial(HttpApplicationState, MethodInfo[]处理程序,IntPtr appContext,HttpContext)+304
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext)+404
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+475

[HttpException(0x80004005):无法自动绑定导航 源实体的实体类型“Data.Team”上的属性“Players” 设置“团队”,因为存在两个或多个匹配的目标实体集。 匹配的实体集是:玩家、锦标赛。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext上下文)+12599232 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext上下文) +159 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext上下文)+12438981

我有什么问题


谢谢

玩家中有两个指向球队、国家队和俱乐部的导航属性,然后还有来自球队的属性,即EF无法解析的属性,因为它无法猜测此集合是否指向国家队或球队属性,因此您必须帮助他,一种方法是使用InverseProperty属性装饰属性:

public class Team
{ 
    [InverseProperty("Club")]   
    public virtual ICollection<Player> ClubPlayers { get; set; }
    [InverseProperty("National")]
    public virtual ICollection<Player> NationalPlayers { get; set; }
}
公共类团队
{ 
[反向财产(“俱乐部”)]
公共虚拟ICollection ClubPlayers{get;set;}
[反向财产(“国家”)]
公共虚拟ICollection NationalPlayer{get
           builder.EntitySet<User>("Users");
           builder.EntitySet<User>("Issues");
           builder.EntitySet<User>("Users");
           builder.EntitySet<Issue>("Issues");
Player newPlayer = new Player();
Team team = db.Teams.FirstOrDefault(t => t.Id == 1); // Just illustrating that team is an existing data entity;
team.Players.Add(newPlayer);
// should this set TeamNationalId = 1
// or TeamClubId = 1
public class Team
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MinLength(2, ErrorMessage = "Team name must be at least 2 characters length")]
    public string Name { get; set; }

    [Required]
    public TeamType Type { get; set; }

    //public virtual ICollection<Player> Players { get; set; }
    [InverseProperty("Club")]
    public virtual ICollection<Player> ClubPlayers { get; set; }
    [InverseProperty("National")]
    public virtual ICollection<Player> NationalPlayers { get; set; }


    //public virtual ICollection<Match> Matches { get; set; }
    [InverseProperty("HomeTeam")]
    public virtual ICollection<Match> HomeMatches { get; set; }
    [InverseProperty("AwayTeam")]
    public virtual ICollection<Match> AwayMatches { get; set; }

}
public class Team
{
    public Team()
    {
        ClubPlayers = new HashSet<Player>();
        NationalPlayers = new HashSet<Player>();
    }

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MinLength(2, ErrorMessage = "Team name must be at least 2 characters length")]
    public string Name { get; set; }

    [Required]
    public TeamType Type { get; set; }

    [InverseProperty("Club")]
    public virtual ICollection<Player> ClubPlayers { get; set; }
    [InverseProperty("National")]
    public virtual ICollection<Player> NationalPlayers { get; set; }

    public virtual IEnumerable<Player> Players
    {
        get
        {
            return ClubPlayers.Union(NationalPlayers);
        }
    }

    [InverseProperty("HomeTeam")]
    public virtual ICollection<Match> HomeMatches { get; set; }
    [InverseProperty("AwayTeam")]
    public virtual ICollection<Match> AwayMatches { get; set; }
    public virtual IEnumerable<Match> Matches
    {
        get
        {
            return HomeMatches.Union(AwayMatches);
        }
    }

}