gpt4 book ai didi

c# - EF Core 一对多还是多对多?用户<--> friend

转载 作者:行者123 更新时间:2023-11-30 22:58:03 26 4
gpt4 key购买 nike

我要在我的项目中实现一个用户好友模块。

假设我有 2 个简单的类:

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')
  • 当第二个用户接受时,这 2 个状态将更新为值 3(这里表示“友谊”或类似的东西 - 但现在忘记逻辑。

我不知道如何设计数据库。

它将是一对多的,就像一个用户可以与其他用户建立许多关系?

私钥必须是2个外键:user1, user2

问题是这 2 个外键转到一个表(用户)

我试过这样的:

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

用户友谊类:

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

但从现在开始,我无法从用户实体导航到他的 friend (如 User.Friendship)

当我将导航属性添加到用户类时:

public virtual List<UsersFriendship> UsersFriendships { get; set; }

数据库会有四个字段:user1Id, user2Id, status, userId

最新的字段来自用户类(UsersFriendships 字段)<-- 我不希望我的数据库中有这个字段!

最佳答案

您可以在官方文档中找到一个示例:https://learn.microsoft.com/en-us/ef/core/modeling/relationships#many-to-many .

我调整了这个例子来反射(reflect)你的情况:

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

the latest field comes from user class (UsersFriendships field) <-- and i dont want this field on my database!

将其注册为导航属性(参见我的代码)时,它将不会存储在数据库中。

在其他情况下,如果出于某种原因您不希望 ef core 将某个属性存储在 db 中,请使用 [NotMapped] 属性(namespace System. ComponentModel.DataAnnotations.Schema).

关于c# - EF Core 一对多还是多对多?用户<--> friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53247895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com