Ani*_*nge 6 mariadb entity-framework-core-2.2
我有一个使用MariaDB中的表定义的多对多关系。我正在尝试对相关实体使用Entity Framework Core中的Navigation Properties,但是它们没有水合。
roles
| role_id | role_name |
| 1 | Role-A |
| 2 | Role-B |
Run Code Online (Sandbox Code Playgroud)
groups
| group_id | group_name |
| 1 | Group-A |
| 2 | Group-B |
Run Code Online (Sandbox Code Playgroud)
role_to_group
| role_to_group_id | role_id | group_id |
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
Run Code Online (Sandbox Code Playgroud)
这是班
[Table(name: "role_to_group")]
public class RoleToGroup
{
[Column(name: "role_to_group_id")]
public long RoleToGroupId { get; set; }
[Column(name: "role_id")]
[ForeignKey("RGToRoles")]
public int RoleId { get; set; }
[Column(name: "group_id")]
public int UserGroupId { get; set; }
[Include]
public Role Role { get; set; }
[Include]
public UserGroup UserGroup { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
的[Include]是使用类似于图案水合导航属性的自定义定义属性DbContext.Set<T>().Include("property_name")经由确实反射上的扩展方法T,并发现与该属性的所有属性[Include]上定义。
但是,我无法使其正常工作。导航属性Role并UserGroup返回null。
您认为我做错了什么?另外,请让我知道是否需要在问题中添加更多详细信息!
问题可能是 EF Core 不会自动执行延迟加载。(有关如何实现延迟加载的文档)。
安装这些 NuGet 包后:
并启用延迟加载,例如:
public class MyDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL(@"User Id=root;Host=localhost;Database=Test;");
optionsBuilder
.UseLazyLoadingProxies();
}
public DbSet<UserGroup> UserGroups { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<RoleToGroup> RoleToGroups { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我已经加载了:
using (var context = new MyDbContext())
{
var roleGroup1 = context.RoleToGroups.First();
Console.WriteLine(roleGroup1.Role.Name); //Role-A
Console.WriteLine(roleGroup1.UserGroup.Name); //Group-A
}
Run Code Online (Sandbox Code Playgroud)
延迟加载要求类型是公共的,并且要延迟加载的属性必须是虚拟的:
[Table(name: "role_to_group")]
public class RoleToGroup
{
[Column(name: "role_to_group_id")]
public int RoleToGroupId { get; set; }
[Column(name: "role_id")]
[ForeignKey("roles")]
public int RoleId { get; set; }
[Column(name: "group_id")]
[ForeignKey("groups")]
public int UserGroupId { get; set; }
public virtual Role Role { get; set; } //must be virtual
public virtual UserGroup UserGroup { get; set; }//must be virtual
}
[Table(name: "roles")]
public class Role
{
[Key]
[Column(name: "role_id")]
public int RoleId { get; set; }
[Column(name: "role_name")]
public string Name { get; set; }
}
[Table(name: "groups")]
public class UserGroup
{
[Key]
[Column(name: "group_id")]
public int GroupId { get; set; }
[Column(name: "group_name")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
除了延迟加载之外,还可以从同一文档使用手动预加载或显式加载。
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |