webentwicklung-frage-antwort-db.com.de

Entity Framework Code-First - Definieren Sie den Schlüssel für diesen EntityType

Hallo, ich habe vor, EF Code First in einem meiner Projekte zu testen. Das will ich eigentlich. Ich habe drei Tabellen und die Struktur sieht wie folgt aus

public partial class App_user
    {
        public int id { get; set; }
        public string name { get; set; }
        public string email_address { get; set; }
        public string password { get; set; }
        public int user_type { get; set; }
        public List<Role> Roles { get; set; }
    }

public partial class Role
    {
        public int id { get; set; }
        public string name { get; set; }
    }
public partial class User_role
    {
        public int user_id { get; set; }
        public int role_id { get; set; }
        public virtual Role Role { get; set; }
        public virtual App_user App_user { get; set; }
    }

In der dritten Tabelle gibt es keinen Primärschlüssel. Es gibt also einen Fehler beim Laufen. Hier ist die Fehlermeldung - 

System.Data.Edm.EdmEntityType:: EntityType 'User_role' hat keinen Schlüssel definiert. Definieren Sie den Schlüssel dafür EntityType . System.Data.Edm.EdmEntitySet: EntityType: Der EntitySet-Benutzer steuert basiert auf dem Typ User_role, der keine .__ hat. Schlüssel definiert.

Warum passiert es? Gibt es dafür eine Lösung? 

25
Mukesh

Wenn Sie denken, Sie versuchen, die Beziehung zwischen Benutzern und Rollen zu modellieren. In diesem Fall ist Ihr Modell völlig falsch.

Verwenden Sie stattdessen diese:

public partial class App_user
{
    public int id { get; set; }
    public string name { get; set; }
    public string email_address { get; set; }
    public string password { get; set; }
    public int user_type { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
}

public partial class Role
{
    public int id { get; set; }
    public string name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

Dadurch werden automatisch viele-zu-viele erstellt und Sie müssen sich nicht mit der Junction-Tabelle beschäftigen. Wenn Sie die Junction-Tabelle freigeben müssen, müssen Sie Folgendes verwenden:

public partial class App_user
{
    public int id { get; set; }
    public string name { get; set; }
    public string email_address { get; set; }
    public string password { get; set; }
    public int user_type { get; set; }
    public virtual ICollection<User_Role> UserRoles { get; set; }
}

public partial class Role
{
    public int id { get; set; }
    public string name { get; set; }
    public virtual ICollection<User_Role> UserRoles { get; set; }
}

public partial class User_role
{
    [Key, ForeignKey("App_user"), Column(Order = 0)]
    public int user_id { get; set; }
    [Key, ForeignKey("Role"), Column(Order = 1)]
    public int role_id { get; set; }
    public virtual Role Role { get; set; }
    public virtual App_user App_user { get; set; }
}

Das Anzeigen von Junction-Tabellen ist bedeutungslos, wenn Sie keine zusätzlichen Eigenschaften benötigen. 

Zu Ihrem Fehler: Für jede Entität in Entity Framework muss ein Primärschlüssel definiert sein.

37
Ladislav Mrnka

Sie können einfach so machen: 

public partial class User_role
{
    [Key]
    public int user_id { get; set; }
    [Key]
    public int role_id { get; set; }
    public virtual Role Role { get; set; }
    public virtual App_user App_user { get; set; }
}
18
Yngve B-Nilsen

Da ich ein ADO.net Entiry Data Model mit automatisch generiertem Code verwendet habe, wollte ich die Modellklassen nicht ändern. Daher habe ich die WebApiConfig.cs geändert, um die Schlüssel der zugrunde liegenden Modelle zu definieren:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
EntitySetConfiguration<Registration> EntitySetConfiguration_Registration = builder.EntitySet<Registration>("Registration");
EntitySetConfiguration<Lead> EntitySetConfiguration_Lead = builder.EntitySet<Lead>("Lead");
EntitySetConfiguration<Session> EntitySetConfiguration_Session = builder.EntitySet<Session>("Session");
EntitySetConfiguration_Registration.EntityType.HasKey(p => p.Registration_Id);
EntitySetConfiguration_Lead.EntityType.HasKey(p => p.Lead_Id);
EntitySetConfiguration_Session.EntityType.HasKey(p => p.Session_Id);
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
1
LiQuick.net

vergewissern Sie sich, dass Sie (mit System.ComponentModel.DataAnnotations;) verwenden.

fügen Sie einfach das Schlüsselwort [Key] im Datenfeld des Modells ein

0
Nelson