joh*_*y 5 6 c# entity-framework entity-framework-core asp.net-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; }
}
Run Code Online (Sandbox Code Playgroud)
我的实体看起来像这样:
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; }
}
Run Code Online (Sandbox Code Playgroud)
所有引用ConversationId都从代码中删除,我已经重建,但我仍然遇到此错误,我不明白为什么.
这是我的SQL Server表,你可以看到没有ConversationId:
是否有需要删除的秘密缓存或我必须运行以更新此缓存?
Iva*_*oev 12
EF Core是基于代码的ORM,其中最重要的是M-Mapper.实际的数据库结构是什么并不重要,重要的是EF*认为**它基于您的代码模型(实体类及其属性,结合数据注释,流畅配置和约定集).
所以问题应该来自代码.由于您已删除显式属性,因此应该由shadow属性引起.正如文档链接中所解释的,影子属性通常通过约束来引入关系:
当发现关系但在依赖实体类中找不到外键属性时,可以按约定创建阴影属性.在这种情况下,将引入影子外键属性.
该文档还解释了在不同场景中应用的命名规则.
调用的shadow属性ConversationId可以通过多种方式引入,但根据提供的信息,最可能的原因是通过具有集合类型导航属性来创建一个名为Conversation定义一对多关系的实体类ServiceRequest:
public class Conversation
{
public int Id { get; set; }
// ...
public ICollection<ServiceRequest> ServiceRequests { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
根据你的评论确实如此.
为了完整性,以下是生成此类属性的一些其他可能方案:
(1)Conversation参考导航属性中没有集合导航属性ServiceRequest:
public class Conversation
{
public int Id { get; set; }
// ...
}
public class ServiceRequest
{
// ...
public Conversation Conversation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
(2)没有导航属性Conversation和ServiceRequest流畅的配置:
modelBuilder.Entity<Conversation>()
.HasMany<ServiceRequest>();
Run Code Online (Sandbox Code Playgroud)
要么
modelBuilder.Entity<ServiceRequest>()
.HasOne<Conversation>();
Run Code Online (Sandbox Code Playgroud)
或以上的变化.
(3)不涉及任何关系,通过流畅的配置创建阴影属性:
modelBuilder.Entity<ServiceRequest>()
.Property<int>("ConversationId");
Run Code Online (Sandbox Code Playgroud)