首页 > 解决方案 > 使用 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)。

是否可以确认以下内容;

  1. 如何AddressCompany没有特定 ID 的情况下引用 ?
  2. 如何添加Company.Contact.Address到添加到列表中的第一个联系人?

标签: entity-framework-coreentity-framework-core-3.1

解决方案


推荐阅读