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
}
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 –
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. –