[英]Entity Framework Core: navigation property based collection
假设我们在 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。 问题是当然这 2 个 collections 必须始终彼此同步。
有什么方法可以确保自定义集合始终符合导航属性?
如果标记请求的行为不需要保留到 UserRequest 表中,那么您可以考虑将未映射的属性添加到名为“Flagged”的请求实体中。
IE
public class Request
{
// normal mapped properties.
[NotMapped]
public bool Flagged { get; set; }
}
这里的限制是它只与已经加载的实体相关。 您不能在 EF Linq 查询中使用它。 如果将用户和请求投影到视图模型,则最好在视图 model 中提供此属性。
如果您确实需要将标记的 state 保留到 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; }
}
这意味着更改用户和请求之间的关系以通过用户请求导航以相互访问。
即代替:
foreach(var request in user.Requests)
{
// do stuff..
}
变成..
foreach(var userRequest in user.UserRequests)
{
var request = userRequest.Request;
// do stuff..
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.