2017-05-02 6 views
0

Ich mache eine Fantasy-Spiel-Anwendung. Im Moment kann ein Team mehrere Spieler haben, aber auch mehrere Benutzer (wie Liga). Wenn ich versuche, der Team-Tabelle eine Sammlung hinzuzufügen, erhalte ich den folgenden Fehler: (siehe unten). Ich habe versucht, die Lösung online zu finden und es scheint, dass dieses Problem durch eine viel zu viele Beziehung verursacht wird. Ich sehe jedoch nicht, wie das möglich ist. Ein Team kann viele Benutzer haben, aber ein Benutzer kann nur ein Team haben. Die Lösung war, eine Join-Tabelle zu erstellen, aber warum würde ich eine Spalte für jede Tabelle erstellen, um auf eine Join-Tabelle zu verweisen, die die Daten enthält, wenn ich einfach die Spalte jeder Tabelle mit der anderen Tabelle verbinden könnte? Weiß jemand, was diesen Fehler verursacht und wie er zu beheben ist?EF - Die Beziehung kann nicht ermittelt werden

System.InvalidOperationException: Unable to determine the relationship represented by navigation property 'Team.Manager' of type 'User'. Either manually configure the relationship, or ignore this property from the model. at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.PropertyMappingValidationConvention.Apply(InternalModelBuilder modelBuilder) 
    at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnModelBuilt(InternalModelBuilder modelBuilder) 
    at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator) 
    at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) 
    at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() 
    at Microsoft.EntityFrameworkCore.Internal.LazyRef`1.get_Value() 
    at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 
    at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.AddMigration(String name, String outputDir, String contextType) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsAddCommand.Execute(CommonOptions commonOptions, String name, String outputDir, String context, String environment, Action`1 reporter) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsAddCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
Unable to determine the relationship represented by navigation property 'Team.Manager' of type 'User'. Either manually configure the relationship, or ignore this property from the model. 

Team.cs

public class Team 
{ 
    [Key] 
    public int ID { get; set; } 
    public int ManagerID { get; set; } 
    public string Name { get; set; } 

    [ForeignKey("ManagerID")] 
    public virtual User Manager { get; set; } 
    public virtual ICollection<Player> Players { get; set; } 
    // Unable to determine the relationship represented by navigation property 'Team.Manager' of type 'User' 
    public virtual ICollection<User> TeamMebers { get; set; } 


    public Team() 
    { 
     TeamMebers = new List<User>(); 
     Players = new List<Player>(); 
    } 
} 

User.cs

public class User 
{ 
    [Key] 
    public int ID { get; set; } 
    public int? TeamID { get; set; } 
    public string UserName { get; set; } 
    public string Name { get; set; } 
    public bool ShowAsPm { get; set; } 
    public string Deactiviated { get; set; } 

    [ForeignKey("TeamID")] 
    public virtual Team Team { get; set; } 
    // How many hours they played 
    public virtual ICollection<Log> Hours { get; set; } 

    public User() 
    { 
     Hours = new List<Log>(); 
    } 
} 

Log.cs

public class Log 
{ 
    [Key] 
    public int ID { get; set; } 
    public int? GameID { get; set; } 
    public int? ResultID { get; set; } 
    public int? UserID { get; set; } 

    public string SmNumber { get; set; } 
    public decimal? Duration { get; set; } 
    public DateTime LogDate { get; set; } 

    [ForeignKey("GameID")] 
    public virtual Game Game { get; set; } 
    [ForeignKey("ResultID")] 
    public virtual GameResult Result { get; set; } 
    [ForeignKey("UserID")] 
    public virtual User User { get; set; } 

    public Log() { } 
} 

Context.cs

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    //builder.Entity<Team>().HasMany(t => t.TeamMebers).WithOne(u => u.Team).HasForeignKey(u => u.ID); 
    //builder.Entity<User>().HasOne(u => u.Team).WithMany(t => t.TeamMebers).HasForeignKey(t => t.ID); 
    builder.Entity<Team>().ToTable("Teams"); 
    builder.Entity<User>().ToTable("Users"); 
    builder.Entity<Log>().ToTable("Logs"); 
} 

aktualisieren

protected override void OnModelCreating(ModelBuilder builder) 
{ 
    builder.Entity<Team>().ToTable("Teams"); 
    builder.Entity<User>().ToTable("Users"); 
    builder.Entity<User>().HasOne(u => u.Team).WithMany(u => u.TeamMebers); 
    builder.Entity<Log>().ToTable("Logs"); 
} 

Exception

System.InvalidOperationException: The current CSharpHelper cannot scaffold literals of type 'System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]'. Configure your services to use one that can. at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpHelper.UnknownLiteral(Object value) 
    at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateAnnotation(IAnnotation annotation, IndentedStringBuilder stringBuilder) 
    at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityTypeAnnotations(IEntityType entityType, IndentedStringBuilder stringBuilder) 
    at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityType(String builderName, IEntityType entityType, IndentedStringBuilder stringBuilder) 
    at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.GenerateEntityTypes(String builderName, IReadOnlyList`1 entityTypes, IndentedStringBuilder stringBuilder) 
    at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpSnapshotGenerator.Generate(String builderName, IModel model, IndentedStringBuilder stringBuilder) 
    at Microsoft.EntityFrameworkCore.Migrations.Design.CSharpMigrationsGenerator.GenerateMetadata(String migrationNamespace, Type contextType, String migrationName, String migrationId, IModel targetModel) 
    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.ScaffoldMigration(String migrationName, String rootNamespace, String subNamespace) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.AddMigration(String name, String outputDir, String contextType) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsAddCommand.Execute(CommonOptions commonOptions, String name, String outputDir, String context, String environment, Action`1 reporter) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsAddCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
The current CSharpHelper cannot scaffold literals of type 'System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]'. Configure your services to use one that can. 

Antwort

2

Das 'Problem' mit Ihrer Situation ist in der Ausnahme erklärt Sie bekommen:

Unable to determine the relationship represented by navigation property 'Team.Manager' of type 'User'. Either manually configure the relationship, or ignore this property from the model. 

Die Lösung, da die Die Nachricht schlägt vor, diese Beziehung manuell zu definieren.

Dies löst jedoch Ihr Problem nicht vollständig, da dies das Problem nicht löst, wenn eines der Mitglieder ein Manager ist.

Eine bessere Lösung wäre die Verwendung der folgenden Zwischenklasse, die die Beziehung behandelt, während gleichzeitig eines der Mitglieder als Manager markiert wird. Dadurch wird das Problem einer einzelnen Managereinschränkung pro Team immer noch nicht gelöst, aber es kommt viel näher.

public class TeamMember { 
    public int MemberId {get;set;} 
    public int TeamId {get;set;} 
    public bool IsManager {get;set;} 

    public virtual User Member {get;set;} 
    public virtual Team Team {get;set;} 
} 
//Either add an ID or use fluent API to define the key to be a combination of player/teamid 
+0

Spieler sind die Charaktere, die Sie spielen können. Warum muss ich eine Beziehung für Spieler definieren, haben sie keine Beziehung zu Benutzern? – John

+0

Mein schlechtes. Es sollte TeamMembers sein, nicht Players. Bearbeitet die Antwort auf diese –

+0

Bitte lesen Sie die aktualisierte Frage. Ich habe einen Fehler beim Versuch, die Beziehung zu definieren. – John

Verwandte Themen