实体框架核心+ MariaDB-导航属性为null

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]上定义。

但是,我无法使其正常工作。导航属性RoleUserGroup返回null。

您认为我做错了什么?另外,请让我知道是否需要在问题中添加更多详细信息!

Ren*_*nat 0

问题可能是 EF Core 不会自动执行延迟加载。(有关如何实现延迟加载的文档)。

安装这些 NuGet 包后:

  • Microsoft.EntityFrameworkCore.Proxies
  • Microsoft.EntityFrameworkCore.Relational

并启用延迟加载,例如:

    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)

除了延迟加载之外,还可以从同一文档使用手动预加载或显式加载。