c# - ServiceStack OrmLite 多对一关系

标签 c# orm servicestack many-to-one ormlite-servicestack

我刚开始使用 Service Stack ORMLite for SQL Server 并且无法弄清楚一些事情。让我通过示例向您展示我正在努力实现的目标:

我有 2 个表 - 用户和角色

public partial class Users : IHasId<int>
{
[AutoIncrement]
public int Id { get; set; }
[Required]
public string Email { get; set; }
[Required]
public string Password { get; set; }
[References(typeof(Roles))]
[Required]
public int RolesId { get; set; }
}

public partial class Roles : IHasId<int>
{
[AutoIncrement]
public int Id { get; set; }
[Required]
public string Name { get; set; }
}

一个用户只能属于一个角色。但许多用户也可以是同一角色的一部分。示例:

User 1 - Role 1
User 2 - Role 1
User 3 - Role 2

当我执行这段代码时

db.LoadSelect<Users>(x => x.Id == 1);

我得到了 Users 对象。我希望查询也返回 Roles 对象(而不是我单独查询 Roles 表),我该怎么做?我在这里错过了什么?我不想要“有多少用户拥有 X 角色?” (像这样的典型的一对多关系:ServiceStack OrmLite mapping with references not working),而不是我想要“这个用户的角色是什么?”

最佳答案

A User can only belong to 1 Role 是一个 1:1 的关系,在 OrmLite 中使用 self references 支持。通过向 Users 表添加 Roles 属性,例如:

public partial class Users : IHasId<int>
{
    [AutoIncrement]
    public int Id { get; set; }
    [Required]
    public string Email { get; set; }
    [Required]
    public string Password { get; set; }

    [References(typeof(Roles))]
    [Required]
    public int RolesId { get; set; }

    [Reference]
    public Roles Roles { get; set; }
}

public partial class Roles : IHasId<int>
{
    [AutoIncrement]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
}

然后将在使用 Load* API 时填充,例如:

db.CreateTable<Roles>();
db.CreateTable<Users>();

db.Insert(new Roles { Name = "Role 1" });
db.Insert(new Roles { Name = "Role 2" });

db.Insert(new Users { Email = "user1@gmail.com", Password = "test", RolesId = 1 });
db.Insert(new Users { Email = "user2@gmail.com", Password = "test", RolesId = 1 });
db.Insert(new Users { Email = "user3@gmail.com", Password = "test", RolesId = 2 });

var user1 = db.LoadSelect<Users>(x => x.Id == 1);

user1.PrintDump();

打印出用户 1 和角色 1:

[
    {
        Id: 1,
        Email: user1@gmail.com,
        Password: test,
        RolesId: 1,
        Roles: 
        {
            Id: 1,
            Name: Role 1
        }
    }
]

我创建了一个 Live example of this on Gistlyn你可以试验一下。

关于c# - ServiceStack OrmLite 多对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47848557/

相关文章:

c# - 无法在 Windows 应用商店应用程序中删除 Sqlite 数据库中的记录

c# - Unity 将默认命名空间添加到脚本模板?

asp.net - OrmLite 真的与数据库无关吗?

servicestack - 为什么 ServiceStack 身份验证使用 cookie 而不是 sessionId header ?

c# - UWP 检查文件是否存在

c# - 最佳实践 - 警告 : method lacks 'await' operator warning

php - Doctrine 1.2 自动加入 i18n?

java - mybatis:将映射器接口(interface)与 XML 配置一起用于全局参数

entity-framework - .NET 2.0 是否有类似 Entity Framework 的 ORM? (数据库优先!)

macos - OSX 上的 ServiceStack 入门