簡體   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