Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何迁移实体框架中已建立的一对多关系?_C#_Entity Framework_Sqlite_Ef Fluent Api - Fatal编程技术网

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; }
    }