繁体   English   中英

实体框架核心-一种用于多个查询的模型

[英]Entity Framework Core - one model for multiple queries

我有一个使用实体框架核心的.NET Core API。 我们使用.FromSQL()执行存储过程。 我遇到的问题是,我们有两个查询返回Account信息-一个查询单个帐户,另一个查询页面列表。

帐户列表返回RowCount的列,单个帐户查询不返回该列,因此现在单个帐户查询返回错误( Rowcount返回数据库中帐户的总数,而不仅仅是请求页面上的帐户,因此您知道如何有很多页的数据)。

错误:

'FromSql'操作的结果中没有所需的列'RowCount'

这是模型

public class Account
{
    [Key]
    public long AccountId { get; set; }

    public string AccountName { get; set; }
    public bool IsDeleted { get; set; }
    public int RowCount { get; set; }

    [NotMapped]
    public bool Found => AccountId > 0;
}

还有我们的dbContext

public class AccountDbContext : DbContext
{
    private DbSet<Account> TAccount { get; set; }

    public AccountDbContext(DbContextOptions<AccountDbContext> options) : base(options)
    {
    }

    public Account GetAccountById(long accountId)
    {
        var pAccount = new SqlParameter("accountId", accountId);
        Account account = TAccount.FromSql("EXEC dbo.SPR_Account_GetById @accountId", pAccount).FirstOrDefault();
        return account;
    }

    public List<Account> GetAccounts(int offset, int limit)
    {
        var pOffset = new SqlParameter("offset", offset);
        var pLimit = new SqlParameter("limit", limit);

        var dataSet = TAccount.FromSql($"EXEC dbo.SPR_Account_GetAll @offset=@offset,@limit=@limit", pOffset, pLimit).ToList();

        return dataSet;
    }
}

我的问题:是否有办法在两个查询中重用此模型? 我认为创建具有相同属性的第二个模型是愚蠢的。 而且我永远也无法让实体与继承融为一体。 它总是给我一个关于找不到Discrimitator的错误。

多亏克里斯·普拉特(Chris Pratt)和丹尼斯(Dennis)1679,我才进一步研究了继承。 当基类和派生类都注册为可查询类型时,实体框架不喜欢它。 我创建了具有公共属性和两个派生类的基类:一个用于单个帐户,一个用于包含RowCount属性的列表。 我对假继承不是100%满意,但是我不必从存储的proc中返回虚拟RowCount,也不必复制对象。

public class AccountBase
{
    [Key]
    public long AccountId { get; set; }

    public string AccountName { get; set; }
    public bool IsDeleted { get; set; }

    [NotMapped]
    public bool Found => AccountId > 0;
}

public class AccountDataModel : AccountBase
{
}

public class AccountCount : AccountBase
{
   public int RowCount { get; set; }
}

然后,在我的dbContext中:

public class AccountDbContext : DbContext
{
    private DbSet<AccountDataModel> TAccount { get; set; }
    private DbSet<AccountCount> AccountList { get; set; }

    public AccountDbContext(DbContextOptions<AccountDbContext> options) : base(options)
    {
    }

    public Account GetAccountById(long accountId)
    {
        var pAccount = new SqlParameter("accountId", accountId);
        Account account = TAccount.FromSql("EXEC dbo.SPR_Account_GetById @accountId", pAccount).FirstOrDefault();
        return account;
    }

    public List<Account> GetAccounts(int offset, int limit)
    {
        var pOffset = new SqlParameter("offset", offset);
        var pLimit = new SqlParameter("limit", limit);

        var dataSet = AccountList.FromSql($"EXEC dbo.SPR_Account_GetAll @offset=@offset,@limit=@limit", pOffset, pLimit).ToList();

        return dataSet;
    }
}

为了将FromSql与实体一起使用,返回的内容与实体的属性之间必须存在直接的一对一关联。 这不是可选的,没有其他选择。

但是,如果使用DTO类,则可以做任何您想做的事情。 您只需将其添加到您的上下文中,例如:

public DbQuery<AccountDTO> AccountDTOs { get; set; }

然后,您可以改用FromSql ,而不会遇到任何问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM