【问题标题】:Entity Framework Core DbSet is not returning any data from databaseEntity Framework Core DbSet 没有从数据库返回任何数据
【发布时间】:2020-11-13 06:05:39
【问题描述】:

Entity Framework Core DbSet 没有从数据库返回任何数据,但是数据库有很多寄存器。

这是实体

public class Entity : BaseEntity
{
    public int EntityStatusId { get; set; }
    public int AddressId { get; set; }
    public string Name { get; set; }
    public string SocialReason { get; set; }
    public string CNPJ { get; set; }
    public EntityType Type { get; set; }
    public DateTime? CreationDate { get; set; }
    public bool? ReceiptDisabled { get; set; }
    public EntityStatus EntityStatus { get; set; }
    public Address Address { get; set; }
    public List<Company> Companies { get; set; }
    public List<Role> RoleList { get; set; }
}

public abstract class BaseEntity
{
    public int Id { get; set; }
}

现在这是配置类。

public class EntityMap : IEntityTypeConfiguration<Entity>
{
    public void Configure(EntityTypeBuilder<Entity> builder)
    {
        builder.ToTable("Entity");
        builder.HasKey(entity => entity.Id);
    
        builder
            .Property(entity => entity.EntityStatusId);
        builder
            .Property(entity => entity.AddressId);
        builder
            .Property(entity => entity.Name);
        builder
            .Property(entity => entity.SocialReason);
        builder
            .Property(entity => entity.CNPJ);
        builder
            .Property(entity => entity.Type)
            .HasConversion(x => (int)x, x => (EntityType)x);
        builder
            .Property(entity => entity.CreationDate);
        builder
            .Property(entity => entity.ReceiptDisabled);

        builder
            .HasOne(entity => entity.EntityStatus);
        builder
            .HasOne(entity => entity.Address);
    
        builder
            .HasMany(entity => entity.RoleList)
            .WithOne(x => x.Entity);
        builder
            .HasMany(entity => entity.Companies)
            .WithOne(x => x.Entity);
    }
}

还有上下文类。

    public class AucContext : DbContext
    {
        public AucContext(string databaseConfiguration)
        {
            _databaseConfiguration = databaseConfiguration;
        }
        
        private readonly string _databaseConfiguration;

        public DbSet<Campaign> Campaigns { get; set; }
        public DbSet<CampaignProject> CampaignProjects { get; set; }
        public DbSet<Company> Companies { get; set; }
        public DbSet<Cart> Carts { get; set; }
        public DbSet<CartItem> CartItems { get; set; }
        public DbSet<Donation> Donations { get; set; }
        public DbSet<DonationRecurrencePeriod> DonationRecurrencePeriods { get; set; }
        public DbSet<Entity> Entities { get; set; }
        public DbSet<Institution> Institutions { get; set; }
        public DbSet<PaymentMethod> PaymentMethods { get; set; }
        public DbSet<Person> People { get; set; }
        public DbSet<Project> Projects { get; set; }
        public DbSet<User> Users { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new CampaignMap());
            modelBuilder.ApplyConfiguration(new CampaignProjectMap());
            modelBuilder.ApplyConfiguration(new CompanyMap());
            modelBuilder.ApplyConfiguration(new CartMap());
            modelBuilder.ApplyConfiguration(new CartItemMap());
            modelBuilder.ApplyConfiguration(new DonationMap());
            modelBuilder.ApplyConfiguration(new DonationRecurrencePeriodMap());
            modelBuilder.ApplyConfiguration(new EntityMap());
            modelBuilder.ApplyConfiguration(new InstitutionMap());
            modelBuilder.ApplyConfiguration(new PaymentMethodMap());
            modelBuilder.ApplyConfiguration(new PersonMap());
            modelBuilder.ApplyConfiguration(new ProjectMap());
            modelBuilder.ApplyConfiguration(new UserMap());
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(_databaseConfiguration);
        }
    }

而且查询很简单

var entity = context.Entities.Find(3)

这个简单的查询没有返回任何内容,对正在发生的事情有什么想法吗?

更新

我从昨天开始更新了一些东西,现在我更新了问题,不幸的是仍然不起作用

OBS:. ConnectionString 没问题,其他对象也正常。

【问题讨论】:

  • 仔细检查 web.config/app.config 中的连接字符串,并在实际构建文件夹中查找任何配置文件。 (如果是 Windows 应用程序或服务)通常假设应用程序将连接到特定的服务器/数据库,但 EF 配置为创建/更新架构,它已经消失并在其他地方创建了一个空数据库。
  • 最可能的原因是应用程序连接到错误的数据库。检查您的连接字符串。您可以使用 SQL Server 的 Profiler 或扩展事件来查看发送到数据库的命令。您可以配置 EF Core 已使用 ILogger 来记录连接事件及其生成的查询。在 EF Core 5 中,您可以使用 LogTo 将其配置为直接写入控制台或任何其他 StreamWriter
  • 检查 dbContext 似乎是初始化问题。试试var entity = context.Entities.ToList() 如果不起作用问题是上下文未初始化
  • 你可以尝试添加 virtual 用于收藏导航public virtual List&lt;Company&gt; Companies { get; set; } public virtual List&lt;Role&gt; RoleList { get; set; }
  • @PanagiotisKanavos OP 在首次发布问题时并未包含地图注册码。他只是包括实体和地图类,并说他没有返回数据。所以我最初的想法是他没有为实体注册映射。此后他更新了他的问题。

标签: entity-framework asp.net-core .net-core entity-framework-core


【解决方案1】:

首先,将Id 添加到您的Entity

public int Id { get; set; }

然后在你的DbContext:

1:在你的OnModelCreating,添加

modelBuilder.ApplyConfiguration(new EntityMap());

2:添加数据库集:

public DbSet<Entity> Entity { get; set; }

重新迁移并更新数据库。您的代码将正常工作。

【讨论】:

  • 嗨@Yinqiu,感谢您的回答,但我已经添加了id,并且上下文对象适用于我拥有的其他实体。还是不行。 ://
  • 你加DbSet&lt;Entity&gt;了吗?
  • 您可以重新迁移查看是否迁移成功。
  • 是的!我会用我所有的新作品更新这个问题!
  • 尝试将您的public DbSet&lt;Entity&gt; Entities { get; set; } 放到public DbSet&lt;Entity&gt; Entity { get; set; }
【解决方案2】:

一个有趣的问题,如果一些实体工作,但这个不工作。还有一些额外的事情需要检查/尝试:

  1. 确保您没有重复的映射。例如,如果您的实体与另一个实体有HasMany.WithOne 关系,请确保该其他实体的映射HasOne.WithMany 或其他关系声明回实体。这可能会导致奇怪的行为。

  2. 您的HasOne 关系缺少WithMany 和FK 声明。鉴于您使用“Id”作为实体上的基本继承 PK,您应该考虑明确声明您的 FK 关系。 WithMany 声明在 EFCore 中是可选的,但如果 FK 不遵循约定,则需要声明它。 (而且我不喜欢仅仅决定不工作的约定)

     builder
         .HasOne(entity => entity.EntityStatus)
         .WIthMany()
         .HasForeignKey(entity => entity.EntityStatusId);
     builder
         .HasOne(entity => entity.Address);
         .WIthMany()
         .HasForeignKey(entity => entity.AddressId);
    

尽管如此,EF 应该按照惯例计算 FK 名称。请记住,EF 约定遵循类型名称,而不是属性名称,例如:

public User CreatedBy { get; set; }

按照惯例,会寻找 UserId 的 FK 属性,而不是 CreatedById,这会导致奇怪的行为或错误。

在旁注中,您不需要为实体中的每个属性声明.Property(),只需要为需要一些特殊配置的属性,如 IdentityColumn、NotMapped(忽略)或指定数据约束/长度等。我还建议删除您实体中任何 FK 列的 .Property() 语句

这一切都说,我已经修改了一个测试 EF Core 项目,设置对象之间的重复映射并省略 WithMany() 和 FK 声明,我无法重现您的问题。我认为有一些非常特定于您的架构或映射的东西正在绊倒 EF 来解析这个“实体”对象。如果这些更改不起作用,请将其降低到最小可行对象并删除 all 相关的实体映射,将它们全部设置为 NotMapped 以免破坏您的代码,然后尝试加载您的 @ 987654333@ 对象。从那里一一重新引入关系,直到它停止加载它们并缩小范围。如果您确实确定了负责的恶意映射,请务必发布有关罪魁祸首的详细信息的更新,因为如果其他人被它绊倒,这可能会很有用。

【讨论】:

  • 嗨,@Steve Py!这个周末我尝试了一切,但仍然没有工作。但是,我需要一些时间来更好地了解整个项目,并且我看到了一些可能存在问题的东西。有些类是继承自Entity类的,会不会有问题?
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 2017-06-01
  • 2019-12-02
  • 2021-06-30
  • 2021-04-04
  • 2018-08-31
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多