C# 如何迁移实体框架中已建立的一对多关系?
我有一个C# 如何迁移实体框架中已建立的一对多关系?,c#,entity-framework,sqlite,ef-fluent-api,C#,Entity Framework,Sqlite,Ef Fluent Api,我有一个C#WPF应用程序,它使用SQLite数据库和实体框架。我有一个Contact类,它可以有多条消息,因此存在一对多关系,设置方式如下(简化版): 公共类消息{ 公共int PK{get;set;} public int SenderKey{get;set;} 公共联系人发件人{get;set;} } 公共类联系人{ 公共int PK{get;set;} 公共ICollection消息{get;set;} } 然后,我使用Fluent API设置关系,方法如下: protected ov
C#
WPF
应用程序,它使用SQLite
数据库和实体框架
。我有一个Contact
类,它可以有多条消息,因此存在一对多关系,设置方式如下(简化版):
公共类消息{
公共int PK{get;set;}
public int SenderKey{get;set;}
公共联系人发件人{get;set;}
}
公共类联系人{
公共int PK{get;set;}
公共ICollection消息{get;set;}
}
然后,我使用Fluent API设置关系,方法如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
...
modelBuilder.Entity<Message>()
.HasOptional(e => e.Sender)
.WithMany(e => e.Messages)
.HasForeignKey(e => e.SenderKey);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){
...
modelBuilder.Entity()
.has可选(e=>e.Sender)
.有许多(e=>e.Messages)
.HasForeignKey(e=>e.SenderKey);
}
我会有很多数据(这种循环依赖也会有很多问题,特别是在分离模式下编辑对象时),所以在内存中为每个联系人收集消息不是一个好主意。为了避免这种情况,我想去掉这个列表,因此最好从中实现“约定1”(仅在Message类中包含Contact对象,仅此而已)
这个解决方案的问题是我的应用程序已经发布了,所以我不能简单地改变结构,我需要迁移。我的问题是如何迁移由Fluent API设置的这种关系
我试图在ModelCreating上删除该关系,但在启动应用程序时出现以下异常:
System.Data.SQLite.SQLiteException:SQL逻辑错误没有这样的列:Extent1.Sender\u PK
(那是什么Extent1表?最后我找到了解决方案。我不必实现特定的迁移,只需修改以下内容:
从模型创建上的中删除关系设置
上一步导致问题中出现“sql逻辑错误”。这是因为没有指定外键列名,实体框架搜索默认列,实际上是Sender\u PK
。因此,为了解决这个问题,我在消息
类中添加了一个注释,它告诉实体框架该联系人
对象的外键列名是什么:
从联系人
类中删除消息列表引用(public ICollection Messages{get;set;}
)
因此,经过这三步修改后,我在两个表之间建立了一对多关系,我可以去掉这个列表。没有其他需要,它可以完美地与旧数据库配合使用
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
...
modelBuilder.Entity<Message>()
.HasOptional(e => e.Sender)
.WithMany(e => e.Messages)
.HasForeignKey(e => e.SenderKey);
}
public class Message {
public int PK { get; set; }
public int SenderKey { get; set; }
[ForeignKey("SenderKey")]
public Contact Sender { get; set; }
}