2017-05-25 3 views
0

Also versuche ich eine neue Rolle in meiner MVC5-Anwendung zu erstellen. Jedes Mal, wenn ich eine Ausnahme sagen erhalten:Name der Anwendungsrolle kann nicht null oder leer sein

Name cannot be null or empty

Modell:

public class ApplicationRole : IdentityRole 
    { 
     public new string Id { get; set; } 

     [Display(Name = "Name")] 
     public new string Name { get; set; } 

     [Display(Name = "Description")] 
     [StringLength(100, MinimumLength = 5)] 
     public string Description { get; set; } 
    } 

Controller:

[HttpPost] 
[ValidateAntiForgeryToken] 

public async Task<ActionResult> Create(ApplicationRole model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var role = new ApplicationRole() 
      { 
       Name = model.Name, 
       Description = model.Description 
      }; 
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>()); 
      var result = await roleManager.CreateAsync(role); 
      if (result.Succeeded) 
      { 
       return RedirectToAction("Index", "Roles", model); 
      } 
      else 
      { 
       AddErrors(result); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
    } 
    // If we got this far, something failed, redisplay form 
    return View(model); 
} 

Ausführung wird in der folgenden Zeile:

var result = await roleManager.CreateAsync(role); 

Ausblick:

@model IEnumerable<User_Manager_Interface.Models.ApplicationRole> 
@{ 

    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@Html.ActionLink("Create New", "Create", "Roles", new object { }, new { @class = "stdbtn" }) 


<div class="contenttitle radiusbottom0"> 
    <h2 class="table"><span>Roles</span></h2> 
</div> 

<table cellpadding="0" cellspacing="0" border="0" class="stdtable" id="dyntable"> 
<tbody> 

     @foreach (var item in Model) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.Name) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.Description) 
       </td> 

       <td> 
        @Html.ActionLink("Edit", "Edit", new { id = item.Id }) | 
        @Html.ActionLink("Details", "Details", new { id = item.Id }) | 
        @Html.ActionLink("Delete", "Delete", new { id = item.Id }) 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 

Was ich nicht bekommen, ist diese Rolle die Felder, die ich in meiner Meinung nach passieren bekommt aber der Fehler bestehen bleibt. Irgendwelche Vorschläge, wie ich das umgehen kann? Hoffentlich habe ich genug zur Verfügung gestellt, um den Fehler zu reproduzieren.

UPDATE zu meinem Szenario:

  1. IdentityRole hat seine eigene ID und die Namen Eigenschaften, und wenn ich sie im ApplicationRole Modell erklären und sie mit dem neuen Stichwort Dekoration wird es offensichtlich versteckt die geerbte Mitglied. Ich war mir dessen bewusst, als ich die Frage gepostet habe.

  2. Wenn ich die beiden Eigenschaften völlig zu entfernen, dann löst die Anwendung eine Ausnahme zur Laufzeit beschrieben:

Mapping and metadata information could not be found for EntityType 'User_Manager_Interface.Models.ApplicationRole

zurück gehen 1. Punkt, der Grund, warum ich mit dieser Umsetzung ging über 2. ist, weil mit 1., die Anwendung nicht beendet, sondern wirft stattdessen einen Modellstatusfehler (wie im Titel der Frage beschrieben) über Name Eigenschaft ist null.

Ich versuchte, den Stack-Trace, um weitere Informationen über die Ausnahme zu untersuchen, aber ich konnte nicht mehr Informationen als andere sammeln, was ich schon weiß:

e.StackTrace "
at System.Data.Entity.Core.Objects.ObjectContext.GetTypeUsage(Type entityCLRType)\r\n
at System.Data.Entity.Core.Objects.ObjectContext.ValidateEntitySet(EntitySet entitySet, Type entityType)\r\n
at System.Data.Entity.Core.Objects.ObjectContext.VerifyRootForAdd(Boolean doAttach, String entitySetName, IEntityWrapper wrappedEntity, EntityEntry existingEntry, EntitySet& entitySet, Boolean& isNoOperation)\r\n
at System.Data.Entity.Core.Objects.ObjectContext.AddObject(String entitySetName, Object entity)\r\n
at System.Data.Entity.Internal.Linq.InternalSet 1.<>c__DisplayClassd.<Add>b__c()\r\n
at System.Data.Entity.Internal.Linq.InternalSet
1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)\r\n
at System.Data.Entity.Internal.Linq.InternalSet 1.Add(Object entity)\r\n
at System.Data.Entity.DbSet
1.Add(TEntity entity)\r\n
at Microsoft.AspNet.Identity.EntityFramework.RoleStore`3.d__2.MoveNext()\r\n---

End of stack trace from previous location where exception was thrown ---\r\n
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
at Microsoft.AspNet.Identity.RoleManager 2.<CreateAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult()\r\n at User_Manager_Interface.Controllers.RolesController.d__5.MoveNext() in C:\Users\Linda\UserManager\FSKUserManager\FSK_UserManager_Web\Controllers\RolesController.cs:line 104"

+0

Warum verwenden Sie die [ 'new' Modifikator] (https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/new-modifier) ​​für Ihre Eigenschaften? Es ist nicht was du denkst. –

+0

@FedericoDipuma Überschreibt die Id- und Name-Eigenschaften, die von IdentityRole bereitgestellt werden. Wenn ich die beiden Eigenschaften alle zusammen entferne, beschwert es sich über das Fehlen von Mapping- und Metadaten-Informationen, und wenn ich sie dort habe, beschwert es sich darüber, dass Name null ist, obwohl ich an der Zeichenfolge vorbeigehe. –

+0

Diese Ausnahme zeigt, dass Ihr 'DbContext' möglicherweise nicht korrekt konfiguriert ist. Ihr erstes Problem besteht darin, 'RoleManager ' und 'RoleStore ' mit einem abgeleiteten Typ wie 'ApplicationRole' zu ​​verwenden (der standardmäßig nicht zugeordnet ist). Ich kann nicht mehr sagen, ohne Ihre gesamte Identitätskonfiguration zu sehen. –

Antwort

3

Ich denke, es mit dem new Stichwort zu tun hat, in Eigenschaftsdeklaration. Wenn IdentityRole hat bereits diese Eigenschaften die folgenden Eigenschaften von Ihrem ApplicationRole Modell

public new string Id { get; set; } 

[Display(Name = "Name")] 
public new string Name { get; set; } 

UPDATE entfernen: In Ihrem ApplicationRole Klasse, indem Sie die Id deklarieren und Name Eigenschaften mit dem new Schlüsselwort, sind Sie verstecken tatsächlich die Basisklasse (IdentityRole) Eigenschaften. Daher sind diese Eigenschaften bei jedem Versuch, einen neuen Datensatz zu speichern, null und Sie erhalten den entsprechenden Fehler.

Auch diese Zeile aus

ändern
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>()); 

Um

var roleManager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(db)); 
+0

Ich erhalte einen Fehler, wenn ich diese beiden Eigenschaften lösche -> Nachricht = "Mapping- und Metadateninformationen konnten für EntityType 'User_Manager_Interface.Models.ApplicationRole' nicht gefunden werden." –

+0

@Harold_Finch Ich habe die Antwort aktualisieren ... bitte machen Sie diese Änderung und lassen Sie mich wissen, ob es funktioniert oder nicht. – Kostis

+0

Es funktioniert nicht. Fehler: 'Message =" Der Entitätstyp ApplicationRole ist nicht Teil des Modells für den aktuellen Kontext. "' –

Verwandte Themen