entity-framework-core - 使用 EntityFrameworkCore 3.1.2 ModelBuilder 播种嵌套数据
问题描述
我有一个现有的数据库,我们正在升级并迁移到新的EntityFrameworkCore 3.1.2
解决方案。
现有的数据库设计得很糟糕,但是我需要将一个大型数据集移植到新模型中。
我目前的模型如下(为简洁起见);
public class Company
{
/*reduced for brevity*/
public int AddressId { get; set; }
public Address Address { get; set; }
public IList<Contact> Contacts { get; set; }
}
public class Address
{
/*redcued for brevity*/
public IList<Contact> Contacts { get; set; }
}
public class Contact
{
/*reduced for brevity*/
public int? AddressId { get; set; }
public Address Address { get; set; }
}
当前数据集包含足够的信息来设置以下内容(当前从 CSV 文件中读取);
Company
Company.Address
Company.Contact - singular
Company.Contact.Address
我有以下.HasData
在方法中播种的内容OnModelCreating
;
modelBuilder.Entity<Company>(e =>
{
e.HasData(new
{
Id = company.ID
});
e.OwnsOne(a => a.Address).HasData(new
{
CompanyId = company.ID,
Address1 = company.Address
});
e.OwnsMany(c => c.Contacts).HasData(new
{
CompanyId = company.ID
//How to add in the address data here?
});
});
我试图添加以下内容;
e.OwnsMany(c => c.Contacts).HasData(new
{
CompanyId = company.ID ,
Address = new Address
{
Address1 = company.DirectorAddress,
}
});
但是,这会引发以下错误;
System.InvalidOperationException:无法将类型“地址”标记为拥有,因为已存在同名的非拥有实体类型。
无论Company.Contact.Address
实体是否存在,都会生成要确认的内容。所以我认为这归结于我的外键是相反的(即Company.AddressId
与 相反Address.CompanyId
)。
是否可以确认以下内容;
- 如何
Address
在Company
没有特定 ID 的情况下引用 ? - 如何添加
Company.Contact.Address
到添加到列表中的第一个联系人?
解决方案
推荐阅读
- c++ - 将参数传递给通用 lambda 时复制构造函数不正确
- mysql - MYSQL 触发器使用 currenttimestamp 更新表字段
- c - 如果换行符“0A”是文件的一部分,如何读取完整文件。
- sql - SQL 查找百分比
- mysql - mysql 根据连接显示每个月的结果,结果为 0
- java - 在 getter 方法中使用模式匹配器来格式化日期/删除毫秒
- php - elasticsearch 查询帮助 - 找不到文档
- c# - 在 Identity server4 中使用隐式授权时防止重放攻击?
- angular - Angular Material Design mat-checkbox错误
- sql - 如何在 Laravel 中合并三个 SQL 表?