C#实体框架-社交网络-友谊、聊天实体

C#实体框架-社交网络-友谊、聊天实体,c#,database,entity-framework,orm,data-access-layer,C#,Database,Entity Framework,Orm,Data Access Layer,我正在尝试为我的社交网络学校项目建立一个数据库模型。我使用的是实体框架6。问题是我应该如何为我的友谊和聊天实体建模 我得到这个错误: 未处理的异常: System.Data.Entity.ModelConfiguration.ModelValidationException:在模型生成过程中检测到一个或多个验证错误: Friendly\u Chat\u Source::多重性在关系“Friendly\u Chat”中的角色“Friendly\u Chat\u Source”中无效。因为依赖角色属

我正在尝试为我的社交网络学校项目建立一个数据库模型。我使用的是实体框架6。问题是我应该如何为我的
友谊
聊天
实体建模

我得到这个错误:

未处理的异常:
System.Data.Entity.ModelConfiguration.ModelValidationException:在模型生成过程中检测到一个或多个验证错误:

Friendly\u Chat\u Source::多重性在关系“Friendly\u Chat”中的角色“Friendly\u Chat\u Source”中无效。因为依赖角色属性不是键属性,所以依赖角色的多重性上限必须为“*”

这可能与此有关:

我真的不明白我该怎么做。即使我以某种方式消除了这个错误(不同的db模型),友谊表中的entity framework也会创建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
}
在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);
    }
模型创建时受保护的覆盖无效(DbModelBuilder builder)
{
builder.Entity()
.HasKey(k=>new{k.User1Id,k.User2Id});
builder.Entity()
.HasRequired(u=>u.User1)
.有很多
.HasForeignKey(u=>u.User1Id);
builder.Entity()
.HasRequired(u=>u.User2)
.有很多
.HasForeignKey(u=>u.User2Id)
.WillCascadeOnDelete(假);
}
聊天实体:

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
}
公共类聊天
{
公共int Id{get;set;}
#区域外键
public int?FriendshipUser1Id{get;set;}
public int?FriendshipUser2Id{get;set;}
#端区
#区域导航属性
公共虚拟哈希集消息{get;set;}
[ForeignKey(“FriendshipUser1Id,FriendshipUser2Id”)]
公共虚拟友谊{get;set;}
#端区
}

如果我正确理解您的型号。1友谊有1个用户1和1个用户2。您的设置被排除在外

builder.Entity<Friendship>()
        .HasRequired(u => u.User1)
        .WithMany()
        .HasForeignKey(u => u.User1Id);
builder.Entity()
.HasRequired(u=>u.User1)
.有很多
.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)
builder.Entity()
.HasRequired(u=>u.User1)
.WithRequiredDependant(u=>u.User2)
或
.WithRequiredPrincipal(u=>u.User2)
或
.WithOptional(u=>u.User2)
您也可以尝试组合键,例如:


我还建议您使用或使用Fluent API或数据注释约定。这将使您的代码更具可读性。

我确实像这家伙建议的那样做了:这不是主要问题。我得到的错误是在友谊和聊天实体之间。顺便说一句,我试着使用.WithRequired…()方法,正如你在上面写的,但它们不是那样工作的。它没有给我u=>u.User2选项(而是intellisense给我u=>u.[用户类的任何属性]),而且我也不想使用复合主键。
builder.Entity<Friendship>()
        .HasRequired(u => u.User1)
        .WithRequiredDependant(u => u.User2)
      or
        .WithRequiredPrincipal(u => u.User2)
      or
        .WithOptional(u => u.User2)