[英]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.