我最近从表中删除了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:

c# - Entity Framework Core仍然采用旧列-LMLPHP

是否有需要删除的 secret 缓存或必须运行以更新此缓存的东西?

最佳答案

EF Core是基于代码的ORM,其中最重要的是M-Mapper。实际的数据库结构是什么都没有关系,重要的是EF *会基于您的代码模型(实体类及其属性,以及数据注释,流利的配置和约定集)来考虑EF。

因此,问题应该源于代码。由于您已删除了explicit属性,因此它应该是由shadow property引起的。并且如文档链接中所述,影子属性通常是通过关系从约定中引入的:



该文档还解释了在不同情况下应用的命名规则。

可以通过几种方式引入称为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");

关于c# - Entity Framework Core仍然采用旧列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45685313/

10-11 01:27