2016-06-17 5 views
0

Ich habe ApplicationUser Klasse und mit einem ICollection wie unten:ASP.NET Applicationuser ICollection Entity einfügen UserId null

public class ApplicationUser : IdentityUser 
{ 
    public virtual ICollection<Info> Infos { get; set; }   

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
    {    
     var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
     return userIdentity; 
    }   
} 

und Info-Klasse:

public partial class Info 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(128)] 
    public string UserId { get; set; } 

    [Required] 
    public string Address { get; set; } 

    public virtual ApplicationUser AspNetUser { get; set; } 
} 

Und wenn ich einen applicationuser wie folgt erstellen:

Dies wird Validierungsfehler auftreten: UserId ist erforderlich.Ist etwas, was ich verpasst habe?

+0

Ich nehme an, Sie tun dbcontext.SaveChanges() unter, wo Sie eine Applicationuser erstellen? –

+0

Nein, ich benutze nur das Visual Studio Build-In-Beispiel, so dass folgendes ist: if (result.Succeeded) .... – protoss

+2

Ok ich sehe, so Ihre Liste von 'Infos' nur zugewiesene Adresse =" testAddr " 'und Ihre UserId im Modell ist' [Erforderlich] '. Ich denke, Sie müssen auch UserId in Ihre Liste aufnehmen. –

Antwort

0

In Ihrer Infos Klasse, die UserId Eigenschaft bezieht sich nicht auf die Navigationseigenschaft AspNetUser überhaupt, deshalb ist es fehlgeschlagen. Sie müssen entweder sie richtig nennen:

[Required] 
[StringLength(128)] 
public string UserId { get; set; } 

public virtual ApplicationUser User { get; set; } 

Oder Sie können ein ForeignKey Attribut hinzufügen:

[Required] 
[StringLength(128)] 
public string UserId { get; set; } 

[ForeignKey("UserId")] 
public virtual ApplicationUser AspNetUser { get; set; } 
+0

Danke für die Antwort, ich versuchte die beiden und immer noch nicht funktioniert.nach googled einige Artikel Ich versuchte, entfernen UserId Eigenschaft in Info-Klasse und in ModelBuilder hinzufügen wie: modelBuilder.Entity () .HasMany (e => e. Info) .WithRequired (e => e.AspNetUser) .Karte (a => a.MapKey ("UserId")); Es funktioniert, aber ich brauche die UserId-Eigenschaft in der Info-Klasse. – protoss

0

Von dem, was ich aus dem Code zu verstehen, Sie zu einem Benutzer mehrere Adresse zugeordnet speichern müssen. Ihre UserId-Eigenschaft ist mit [Required] Attribut dekoriert, daher müssen Sie UserId zusammen mit Address speichern, das Hauptproblem ist, dass UserId automatisch erstellt wird, nachdem Sie UserManager.CreateAsync tun. Ich schlage also vor, dass Sie die Adressliste zuweisen, nachdem der Benutzer erfolgreich erstellt wurde.

`var user = new ApplicationUser { UserName = model.Email, Email = model.Email,Addresses =a }; 
var result = await UserManager.CreateAsync(user, model.Password); 
if(result.Succeeded) 
{ 
    //assign list of address to user 
    IList<Info> infos = new List<Info>() { new Info() { Address ="testAddr",UserId = User.Identity.GetUserId()} } 
    dbcontext.SaveChanges() 
    //login here 
}` 

Ich hoffe, es hilft. :-)

+0

Ich habe versucht, Attribut zu entfernen, dann erstellen Benutzer auf die gleiche Weise wie der Ursprungscode dann wokrs.Ich denke, das ist was ich will! – protoss

+0

Yeah das Attribut '[Erforderlich]' verhindert, dass Sie einen Benutzer erstellen können, da Sie ihn vorher zuweisen müssen. Eigentlich können Sie die UserId-Eigenschaft entfernen, da Sie die AspNetUser-Eigenschaft haben, und Sie können es wie AspNetUser.UserId aufrufen, die das gleiche ist. Sehen Sie, welche die bessere Problemumgehung für Sie ist. Cheers ~ :) –

0

Möchten Sie, dass UserId automatisch inkrementiert wird? Denn momentan ist es nirgendwo festgelegt. Sie erhalten diesen Fehler, weil Sie definiert haben, dass dieses Feld benötigt wird:

[Required] 
[StringLength(128)] 
public string UserId { get; set; } 
+0

Ich versuchte entfernen Attribut zu entfernen, dann funktioniert es! Danke – protoss

Verwandte Themen