【问题标题】:C# Entity Framework - Social Network - Friendship, Chat EntityC# 实体框架 - 社交网络 - 友谊、聊天实体
【发布时间】:2018-03-26 14:01:19
【问题描述】:

我正在尝试为我的社交网络学校项目做一个数据库模型。我正在使用 Entity Framework 6。问题是我应该如何为我的 FriendshipChat 实体建模。

我得到这个错误:

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

Friendship_Chat_Source: : 多重性在关系“Friendship_Chat”中的角色“Friendship_Chat_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*'。

这可能与此有关: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 中使用此重写函数 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
}

【问题讨论】:

    标签: c# database entity-framework orm data-access-layer


    【解决方案1】:

    如果我理解你的模型是正确的。 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

    另外我建议你使用 Fluent API 或 Data Annotation 约定。这将使您的代码更具可读性。

    【讨论】:

    • 我真的像这个人建议的那样做到了:stackoverflow.com/questions/13896503/…
    • 这不是主要问题。我得到的错误是在友谊和聊天实体之间。顺便提一句。我尝试使用您在上面写的 .WithRequired...() 方法,但它们不能那样工作。它没有给我 u => u.User2 选项(相反,intellisense 给了我 u => u.[User 类的任何属性]。而且我也不想使用复合主键。
    猜你喜欢
    • 2014-03-29
    • 2012-08-22
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多