Я пытаюсь получить доступ к таблицам в базе данных, но наборы DbSet пусты.
Вот первая половина моей модели (она соответствует представлению в моей базе данных SQL Server):
[Table("vwAccounts")]
public class Account
{
[Column("AccountId")]
public int Id { get; set; }
[Column("AccountUserName")]
public string UserName { get; set; }
[Column("AccountPassword")]
public string Password { get; set; }
[Column("AccountActive")]
public bool Active { get; set; }
[Column("CompanyId")]
public int CompanyId { get; set; }
[Column("DriverId")]
public int DriverId { get; set; }
[Column("AccountTypeName")]
public string TypeName { get; set; }
}
Вот мой DbContext:
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{ }
public DbSet<Account> Accounts { get; set; }
public DbSet<Driver> Drivers { get; set; }
}
Вот моя программа.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer("name=ConnectionStrings:myConString"));
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
...
app.Run();
И вот где я пытаюсь получить доступ к DbSets, но они пусты:
public IEnumerable<Account> GetAccounts()
{
try
{
// HERE is the error.
// db.context.Accounts is null, so it doesn't matter what method I call from it, it throws the error
Account results = dbContext.Accounts.First();
Console.WriteLine(results);
return results;
} catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
Это фактическое сообщение об ошибке:
При использовании отладчика dbContext.Accounts не равно null, это {Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1[MySite.Models.Entities.Account]}. Когда я пытаюсь получить доступ к чему-либо в dbSte, возникает проблема.
Изучив трассировку стека отладчика, я пришел к выводу, что проблема может быть связана с неправильным вводом переменных.
at Microsoft.Data.SqlClient.SqlBuffer.get_Int32()
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
at System.Collections.Generic.LargeArrayBuilder`1.AddRange(IEnumerable`1 items)
at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at System.Linq.SystemCore_EnumerableDebugView`1.get_Items()
Ничего из того, что я упустил, не должно относиться к проблеме. Класс учетных записей — это просто больше полей, а в program.cs просто больше настроек. Я могу попробовать обновить его, но я получил предупреждение о том, что слишком много кода
Судя по вашему коду, нет ничего необычного. Можете ли вы предоставить сообщение об ошибке? bwt, вы сначала используете код или сначала db в ядре ef?
@XinranShen Что вы имеете в виду сначала код, а не сначала база данных? Ничего не генерируется автоматически, но сначала были разработаны таблицы. Если это то, о чем вы спрашиваете
Я понял. После комментирования параметров, пока я не сузил проблему до этих свойств, я понял, что данные в базе данных имеют нулевые значения. Поэтому я исправил это, сделав свои целые числа обнуляемыми:
[Column("CompanyId")]
public Int32? CompanyId { get; set; }
[Column("DriverId")]
public Int32? DriverId { get; set; }
Вы уверены, что dbContext.Accounts равно null, а не dbContext? Не могли бы вы поделиться всем классом?