实体框架核心:基于导航属性的集合



假设我们在EF Core中有以下多对多关系场景,具有以下导航属性:

public class Request{
public HashSet<User> Users { get; set; }
}
public class User{
public HashSet<Request> Requests { get; set; }
}

一个用户可以被简单地分配给多个请求,一个请求可以有多个用户。

现在,我想扩展这个功能,这样每个用户都可以标记分配给他的请求:

public class User{
public HashSet<Request> Requests { get; set; }
public Dictionary<long, bool> RequestsFlags { get; set; } //Request ID (long) and Flag (bool)
}

这样我就可以检查设置了哪个请求标志并相应地更新UI。问题是,当然这两个集合必须总是彼此同步。

是否有任何方法可以确保自定义集合始终符合导航属性?

如果标记请求的行为不需要被持久化到UserRequest表中,那么您可以考虑向request实体添加一个名为"Flagged"的未映射属性。

public class Request
{
// normal mapped properties.

[NotMapped]
public bool Flagged { get; set; }
}

这里的限制是它只与已经加载的实体相关。你不能在EF Linq查询中使用它。如果用户和请求被投影到视图模型中,那么这个属性最好在视图模型中提供。

如果你确实需要将标记状态持久化到UserRequest记录中,那么你需要将连接实体引入到关系中:

public class User
{
// User properties...
// public virtual ICollection<Request> Requests { get; set; } = new List<Request>();
public virtual ICollection<UserRequest> UserRequests { get; set; } = new List<UserRequest();
}

public class User
{
// User properties...
// public virtual ICollection<Users> Users { get; set; } = new List<User>();
public virtual ICollection<UserRequest> UserRequests { get; set; } = new List<UserRequest();
}
public class UserRequest
{ 
[Key, ForeignKey("User"), Column(Order=0)]
public int UserId { get; set; }
[Key, ForeignKey("Request"), Column(Order=1)]
public int RequestId { get; set; }
public bool Flagged { get; set; }
public virtual User User { get; set; }
public virtual Request Request { get; set; }
}

这意味着改变用户和请求之间的关系,通过UserRequests导航到彼此。

。而不是:

foreach(var request in user.Requests)
{
// do stuff..
}

变得. .

foreach(var userRequest in user.UserRequests)
{
var request = userRequest.Request;
// do stuff..
}

相关内容

  • 没有找到相关文章

最新更新