我将在我的项目中实现一个用户朋友模块。
假设我有两个简单的类
public class User
{
int Id { get; set; }
string Name { get; set; }
}和FriendShip类(它在用户之间有关系):
public class FriendShip
{
int User1Id { get; set; }
int User2Id { get; set; }
int Status { get; set; }
}状态类型为Enum
这两个类的逻辑--
user1Id: 1,
user2Id: 2,
Status: 1, (where 1 means 'invited')user1Id: 2,
user2Id: 1,
Status: 0, (where 0 means 'nonaccepted')我不知道如何设计数据库。
这将是一对多,就像一个用户可以有许多关系与其他-用户?
私钥必须是两个外键: user1,user2
问题是这两个外键指向一个表(用户)
我试过像这样的东西
modelBuilder.Entity<User>()
.HasMany(x => x.UsersFriendships)
.WithOne(x => x.User2)
modelBuilder.Entity<UsersFriendship>()
.HasMany(x => x.Users)
.WithOne(x => x.UsersFriendships)但这没有道理,我不能做第二句话
.WithOne(x => x.userFriendships)最简单的方法是输入模型生成器。
modelBuilder.Entity<UsersFriendship>()
.HasKey(x => new { x.User1Id, x.User2Id });UserFriendship类:
public class UsersFriendship
{
[ForeignKey("User1Id")]
public User User1 { get; set; }
[ForeignKey("User2Id")]
public User User2 { get; set; }
public int User1Id { get; set; }
public int User2Id { get; set; }
public RelationStatus RelationStatus { get; set; }
}但是从现在开始,我不能从用户实体导航到他的朋友(比如User.Friendship)。
当我向用户类添加导航属性时
public virtual List<UsersFriendship> UsersFriendships { get; set; }数据库将有四个字段: user1Id、user2Id、status、userId
最近的字段来自user class (UsersFriendships字段) <--我不希望这个字段出现在我的数据库中!
发布于 2018-11-11 10:47:55
您可以在官方文档中找到一个例子:https://learn.microsoft.com/en-us/ef/core/modeling/relationships#many-to-many。
我调整了这个示例以反映您的情况:
namespace foo
{
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<UsersFriendship> UsersFriendships { get; set; }
}
public class Friendship
{
public User User1 { get; set; }
public int User1Id { get; set; }
public User User2 { get; set; }
public int User2Id { get; set; }
public int Status { get; set; }
}
class MyContext : DbContext
{
public DbSet<Friendship> Friendships { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Friendship>()
.HasKey(fs => new { fs.User1, fs.User2, fs.Status });
modelBuilder.Entity<Friendship>()
.HasOne(fs => fs.User1)
.WithMany(u => u.UsersFriendships)
.HasForeignKey(fs => fs.User1);
modelBuilder.Entity<Friendship>()
.HasOne(fs => fs.User2)
.WithMany(u => u.UsersFriendships)
.HasForeignKey(fs => fs.User2);
}
}最近的字段来自user class (UsersFriendships字段) <--我不希望这个字段出现在我的数据库中!
当将其注册为导航属性(请参阅我的代码)时,它将不会存储在db中。
在其他情况下,如果出于某些原因不希望通过ef核心将属性存储在db中,请使用[NotMapped]属性(namespace System.ComponentModel.DataAnnotations.Schema)标记该属性。
https://stackoverflow.com/questions/53247895
复制相似问题