2017-10-14 105 views
-1

我想为我的社交网络学校项目做一个数据库模型。我正在使用实体框架6.问题是我应该如何建模我的FriendshipChat实体。C#实体框架 - 社交网络 - 友谊,聊天实体

我得到这个错误:

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 '*'.

它有可能是一些与此有关:EF Code-First One-to-one relationship: Multiplicity is not valid in Role * in relationship

我真的不明白我应该怎么办在这里。即使我以某种方式摆脱了这个错误(不同的数据库模型),友谊表中的实体框架创建User_Id列作为外键,我真的不知道它为什么会这样做(我不希望它在那里)。但我真的觉得我的模型应该看起来像这样,没有什么不同。所以我想弄清楚,我该如何编辑这个模型。但是,如果你有不同的模型想法,我也会很感激。

用户实体:

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 
} 

友谊实体:

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 
} 

随着MyDbContext这个overrided功能OnModelCreating:

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); 
    } 

聊天实体:

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 
} 

回答

0

如果我理解你的模型是正确的。 1友谊有1个user1和1个user2。您的设置被排除在外。

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

这意味着user1有很多......(很多是什么?)。模型没有任何可以接受这些设置的列表。你的模型只有单个对象。

如果你想要一对一/零:

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

您也可以尝试,例如复合键:Creating Composite Key Entity Framework

此外,我建议你使用或流利的API或数据注解惯例。它会使你的代码更具可读性。

+0

我从字面上使它像这个人建议: https://stackoverflow.com/questions/13896503/how-should-i-model-friendships-between-users-with-ef-code-first –

+0

这不是主要问题。我得到的错误是友谊和聊天实体之间。顺便说一句。我尝试使用.WithRequired ...()方法,就像你上面写的那样,但是它们不能像那样工作。它不给我u => u.User2选项(而不是intellisense给我u => u。[User类的任何属性]。我也不想使用复合主键。 –