实体框架核心仍然采用旧列

时间:2017-08-15 01:33:04

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

我最近从表中删除了一列ConversationId。当我开始调试我的服务并尝试保存时,我收到一个错误:

  

无效的列名称' ConversationId'。

代码:

public class AstootContext : DbContext
{
    public AstootContext(DbContextOptions<AstootContext> options)
        : base(options)
    { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }

    public DbSet<ServiceRequest> ServiceRequests { get; set; }
}

我的实体看起来像这样:

public class ServiceRequest
{
    public int Id { get; set; }
    public int SenderUserId { get; set; }
    public int PriceTypeId { get; set; }
    public decimal Price { get; set; }
    public bool IsAccepted { get; set; }
    public DateTime Created { get; set; }
    public int MessageId { get; set; }
}

ConversationId的所有引用都已从代码中删除,我已经重建,但我仍然收到此错误,我不明白为什么。

这是我的SQL Server表,因为您可以看到没有ConversationId

enter image description here

我需要删除一个秘密缓存还是我必须运行以更新此缓存?

1 个答案:

答案 0 :(得分:9)

EF Core是基于代码的ORM,其中最重要的是M-Mapper。实际的数据库结构是什么并不重要,重要的是EF *认为**它基于您的代码模型(实体类及其属性,结合数据注释,流畅配置和约定集)。

所以问题应该来自代码。由于您已删除显式属性,因此应由shadow property引起。正如文档链接中所解释的, shadow 属性通常按惯例从关系中引入:

  

当发现关系但在依赖实体类中找不到外键属性时,可以通过约定创建阴影属性。在这种情况下,将引入影子外键属性。

该文档还解释了在不同场景中应用的命名规则。

可以通过多种方式引入名为ConversationId的影子属性,但根据提供的信息,最可能的原因是有一个名为Conversation的实体类定义一对多关系使用ServiceRequest具有集合类型导航属性:

public class Conversation
{
    public int Id { get; set; }
    // ...
    public ICollection<ServiceRequest> ServiceRequests { get; set; }
}

根据你的评论确实如此。

为了完整性,以下是产生此类属性的一些其他可能方案:

(1)Conversation中没有集合导航属性,ServiceRequest中的参考导航属性:

public class Conversation
{
    public int Id { get; set; }
    // ...
}

public class ServiceRequest
{
    // ...
    public Conversation Conversation { get; set; }
}

(2)ConversationServiceRequest没有导航属性,流畅的配置:

modelBuilder.Entity<Conversation>()
    .HasMany<ServiceRequest>();

modelBuilder.Entity<ServiceRequest>()
    .HasOne<Conversation>();

或以上的变化。

(3)不涉及任何关系,通过流畅的配置创建阴影属性:

modelBuilder.Entity<ServiceRequest>()
    .Property<int>("ConversationId");