2016-06-04 5 views
1

Ich habe eine viele zu viele Beziehung zwischen AplicationUser-Tabelle von ASP.NET-Identität zu einer benutzerdefinierten Tabelle (Teams). Ich muss einen Benutzer einfügen und verknüpfen Sie es mit einem Team, das bereits in der Datenbank vorhanden ist, muss es auch einen Datensatz in der Tabelle ApplicationUserTeams einfügen. Ich mache so etwas, aber es schafft einen neuen Rekord in der Team Tabelle. Ich habe keinen Zugriff auf den UserManager-Kontext, um ein Team anzuhängen. Ich würde mich über jede Idee freuen.Viele zu viele Beziehung mit ASP.NET-Identitätstabelle und benutzerdefinierte Tabelle

public async Task<IHttpActionResult> RegisterUser(RegisterRecordBindingModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     var user = new ApplicationUser() { UserName = model.Email, Email = model.Email }; 

     var Team = new Team(); 
     Team.TeamId = model.teamId; 
     user.Teams.Add(team); 

     IdentityResult result = await UserManager.CreateAsync(user, model.Password); 

     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 

     return Ok(); 
    } 

Dieses Modell: enter image description here

+0

Können Sie "es funktioniert nicht" angeben? Die Art und Weise, wie die ASP.NET-Identität mit der Modellierung mit Entity Framework vergleichbar ist (wenn nicht identisch ist). – hbulens

+0

Es dupliziert den Datensatz in der Team-Tabelle –

Antwort

0

Wenn ein Unternehmen zu einem Kontext hinzugefügt wird, werden alle anhaftenden Entitäten als Added zu stark ausgeprägt, wenn sie auf den Kontextnoch nicht angebracht sind. Dies ist eine EF-Funktion, die Entwickler immer wieder verwirrt.

Sobald Sie es wissen, es ist klar, was zu tun ist, wenn Sie den Zugriff auf den Kontext haben:

var team = new Team(); 

team.TeamId = model.teamId; 
user.Teams.Add(team); 
context.Teams.Attach(team); 
... 

Aber ich weiß nicht, wie Sie Ihre UserManager instanziiert. Sie haben möglicherweise keinen Zugriff auf den Kontext in Ihrem Controller-Code. Wenn ja, dann ist es besser, die Verknüpfungstabelle im Klassenmodell zu integrieren, die die nackten Klassenmodell wie folgt aussehen würde:

class ApplicationUserTeam 
{ 
    [Key, Column(Order = 1)] 
    public int ApplicationUserID { get; set; } 
    [Key, Column(Order = 2)] 
    public int TeamID { get; set; } 
    public ApplicationUser ApplicationUser { get; set; } 
    public Team Team { get; set; } 
} 

class ApplicationUser 
{ 
    public ApplicationUser() 
    { 
     ApplicationUserTeams = new HashSet<ApplicationUserTeam>(); 
    } 
    public int ID { get; set; } 
    public ICollection<ApplicationUserTeam> ApplicationUserTeams { get; set; } 
} 

class Team 
{ 
    public Team() 
    { 
     ApplicationUserTeams = new HashSet<ApplicationUserTeam>(); 
    } 
    public int ID { get; set; } 
    public ICollection<ApplicationUserTeam> ApplicationUserTeams { get; set; } 
} 

Jetzt können Sie einfach ein ApplicationUserTeam Objekt ApplicationUser.ApplicationUserTeams hinzuzufügen.

+0

Ja, ich habe keinen Zugriff auf den Benutzer-Manager-Kontext hier, aber ich möchte nicht die Junction-Tabelle zu meinem Modell hinzufügen. Mal sehen, ob es vielleicht eine andere Lösung gibt. Vielen Dank. –

+0

Danke Gert, ich habe mich entschieden, deinen Ansatz zu verwenden und es funktioniert sehr gut. Allerdings weiß ich nicht, was Sie mit "... Sie können einfach ein ApplicationUserTeam-Objekt zu ApplicationUser.ApplicationUserTeams hinzufügen" Ich bin der Benutzer erstellen und dann mit der userId kann ich einen ApplicationUserTeam-Datensatz erstellen. Ich weiß nicht, ob ich den Benutzer und den Datensatz im ApplicationUserTeam in derselben Transaktion mit CreateAsync-Methode erstellen kann. Vielen Dank. –

+0

Ja, das sollten Sie können. Erstellen Sie einen Benutzer und fügen Sie ein 'ApplicationUserTeam'-Objekt zu seiner' ApplicationUserTeams'-Sammlung hinzu und speichern Sie dann ('CreateAsync'). –