C#实体框架 - 社交网络 - 友谊,聊天实体
我想为我的社交网络学校项目做一个数据库模型。我正在使用实体框架6.问题是我应该如何建模我的Friendship
和Chat
实体。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
}
如果我理解你的模型是正确的。 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或数据注解惯例。它会使你的代码更具可读性。
我从字面上使它像这个人建议: https://stackoverflow.com/questions/13896503/how-should-i-model-friendships-between-users-with-ef-code-first –
这不是主要问题。我得到的错误是友谊和聊天实体之间。顺便说一句。我尝试使用.WithRequired ...()方法,就像你上面写的那样,但是它们不能像那样工作。它不给我u => u.User2选项(而不是intellisense给我u => u。[User类的任何属性]。我也不想使用复合主键。 –