2017-10-14 1 views
-1

Ich versuche ein Datenbankmodell für mein Schulprojekt im sozialen Netzwerk zu erstellen. Ich benutze Entity Framework 6. Das Problem ist, wie soll ich meine Friendship und Chat Einheit modellieren.C# Entity Framework - Soziales Netzwerk - Freundschaft, Chat Entität

ich diesen Fehler:

Unhandled Exception:
System.Data.Entity.ModelConfiguration.ModelValidationException: One or more validation errors were detected during model generation:

Friendship_Chat_Source: : Multiplicity is not valid in Role 'Friendship_Chat_Source' in relationship 'Friendship_Chat'. Because the dependent role properties are not the key properties, the upper bound of the multiplicity of the dependent role must be '*'.

Es hat wohl etwas damit zu tun: EF Code-First One-to-one relationship: Multiplicity is not valid in Role * in relationship

ich wirklich nicht bekommen, wie soll ich es hier tun. Selbst wenn ich diesen Fehler irgendwie los werde (anderes DB-Modell), erstellt das Entity-Framework in der Friendship-Tabelle die User_Id-Spalte als Fremdschlüssel, und ich weiß nicht genau, warum es das tut (ich will es nicht dort). Aber ich habe das Gefühl, dass mein Modell so aussehen sollte, nicht anders. Also möchte ich wirklich herausfinden, wie ich dieses Modell bearbeiten soll. Wenn Sie jedoch andere Modellidee haben, würde ich es auch zu schätzen wissen.

Benutzer Einheit:

public class User 
{ 
    public int Id { get; set; } 

    [Required, MinLength(1), MaxLength(50)] 
    public string NickName { get; set; } 

    [Required, MinLength(6), MaxLength(50)] 
    public string PasswordHash { get; set; } 

    #region Settings 

    //true if anyone can see user posts 
    public Visibility PostVisibilityPreference { get; set; } = Visibility.Visible; 

    #endregion 

    #region Navigation properties 

    public virtual HashSet<Friendship> Friendships { get; set; } 
    public virtual HashSet<Post> Posts { get; set; } 
    public virtual HashSet<GroupUser> GroupUsers { get; set; } 
    public virtual HashSet<Comment> Comments { get; set; } 

    #endregion 
} 

Freundschaft Einheit:

public class Friendship 
{ 
    #region Primary keys 

    public int User1Id { get; set; } 
    public int User2Id { get; set; } 

    #endregion 

    [Required] 
    public DateTime FriendshipStart { get; set; } 

    #region Foreign keys 

    //defined using fluent api in MyDbContext: 
    //User1Id 
    //User2Id 
    //and 

    [ForeignKey("Chat")] 
    public int? ChatId { get; set; } 

    #endregion 

    #region Navigation properties 

    public virtual User User1 { get; set; } 
    public virtual User User2 { get; set; } 
    public virtual Chat Chat { get; set; } 

    #endregion 
} 

Mit dieser Funktion overrided OnModelCreating in MyDbContext:

protected override void OnModelCreating(DbModelBuilder builder) 
    { 
     builder.Entity<Friendship>() 
      .HasKey(k => new { k.User1Id, k.User2Id }); 

     builder.Entity<Friendship>() 
      .HasRequired(u => u.User1) 
      .WithMany() 
      .HasForeignKey(u => u.User1Id); 

     builder.Entity<Friendship>() 
      .HasRequired(u => u.User2) 
      .WithMany() 
      .HasForeignKey(u => u.User2Id) 
      .WillCascadeOnDelete(false); 
    } 

Chat Einheit:

public class Chat 
{ 
    public int Id { get; set; } 

    #region Foreign keys 

    public int? FriendshipUser1Id { get; set; } 
    public int? FriendshipUser2Id { get; set; } 

    #endregion 

    #region Navigation properties 

    public virtual HashSet<Message> Messagges { get; set; } 

    [ForeignKey("FriendshipUser1Id, FriendshipUser2Id")] 
    public virtual Friendship Friendship { get; set; } 

    #endregion 
} 

Antwort

0

Wenn ich Ihr Modell richtig verstehe. 1 Freundschaft hat 1 Benutzer1 und 1 Benutzer2. Ihre Einstellungen sind ausgeschlossen.

builder.Entity<Friendship>() 
     .HasRequired(u => u.User1) 
     .WithMany() 
     .HasForeignKey(u => u.User1Id); 

Es bedeutet user1 hat viele ... (viele was?). Model hat keine Liste, die diese Einstellungen akzeptieren könnte. Ihr Modell hat nur einzelne Objekte.

Wenn Sie wollen, dass es 12.59/Null:

builder.Entity<Friendship>() 
     .HasRequired(u => u.User1) 
     .WithRequiredDependant(u => u.User2) 
     or 
     .WithRequiredPrincipal(u => u.User2) 
     or 
     .WithOptional(u => u.User2) 

Sie können auch zusammengesetzte Schlüssel zum Beispiel versuchen: Creating Composite Key Entity Framework

Auch empfehle ich Ihnen Fluent API oder Daten Annotation Konvention zu verwenden oder. Es wird Ihren Code lesbarer machen.

+0

ich machte es buchstäblich wie dieser Typ vorgeschlagen: https://StackOverflow.com/questions/13896503/how-should-i-model-friadships-between-users-with-ef-code-first –

+0

Dies ist nicht das Hauptproblem. Der Fehler, den ich bekomme, ist zwischen Freundschaft und Chat-Entität. Übrigens. Ich habe versucht, .WithRequired ...() Methoden zu verwenden, wie Sie oben geschrieben haben, aber sie funktionieren nicht so. Es gibt mir nicht u => u.User2 Option (stattdessen Intellisense gibt mir u => u. [Jede Eigenschaft der Benutzerklasse]. Und ich möchte auch nicht zusammengesetzte Primärschlüssel verwenden. –

Verwandte Themen