C# asp.net core 2.1中的值对象作为无效对象

C# asp.net core 2.1中的值对象作为无效对象,c#,entity-framework-core,asp.net-core-2.1,value-objects,C#,Entity Framework Core,Asp.net Core 2.1,Value Objects,我一直在asp.NETCore2.0项目中使用value对象,该项目运行正常 我将项目更新为2.1,它给了我一个错误 无效的对象名称“EntityAddress”。 实体: public class Company : AuditableEntity<long> { public int SalesRepId { get; set; } public string Name { get; set; } public int StatusId { get; se

我一直在asp.NETCore2.0项目中使用value对象,该项目运行正常

我将项目更新为2.1,它给了我一个错误

无效的对象名称“EntityAddress”。

实体:

public class Company : AuditableEntity<long>
{
    public int SalesRepId { get; set; }
    public string Name { get; set; }
    public int StatusId { get; set; }
    public EntityAdress Addresses { get; set; }
    public string BillingAddress { get; set; }
}

public class EntityAdress : ValueObject
{
    private EntityAdress() { }
    public string Address { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public int Zip { get; set; }

    protected override IEnumerable<object> GetAtomicValues()
    {
        yield return Address;
        yield return City;
        yield return State;
        yield return Zip;
    }
}
背景:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.RemovePluralizingTableNameConvention();
    modelBuilder.OnDeleteCascading();

    modelBuilder.ApplyConfiguration(new CompanyEntityTypeConfiguraton());

    base.OnModelCreating(modelBuilder);

}
公司实体类型配置:

public class CompanyEntityTypeConfiguraton : IEntityTypeConfiguration<Company>
{
    public void Configure(EntityTypeBuilder<Company> orderConfiguration)
    {
        orderConfiguration.OwnsOne(p => p.Addresses, cb =>
        {
            cb.Property(p => p.City).HasColumnName("City");
            cb.Property(p => p.Address).HasColumnName("Address");
            cb.Property(p => p.State).HasColumnName("State");
            cb.Property(p => p.Zip).HasColumnName("Zip");
        });

    }
}

问题的原因可能是什么?是实体框架版本的问题还是实现中缺少了什么?

EF核心版本之间的实现总是会有一些变化。有些可能是错误修复,这可能导致旧代码以不同方式运行

问题在于此代码:

public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
{
    foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
    {
        entity.Relational().TableName = entity.DisplayName();
    }
}
首先,您应该排除拥有的类型(请记住,拥有的类型仍然是EF Core中的实体,因此包含在
GetEntityTypes()
)中):

否则,您将更改EF Core的默认行为,即不为所属实体创建单独的表(所谓的表拆分),以实际创建单独的表,因此,当EF Core构建SQL查询连接到不存在的表时,您会遇到异常

其次,您应该在所有fluent配置之后调用该代码,因为在开始时,所拥有的实体(如果没有标记
[owned]
属性)还没有被识别为这样-它只发生在
OwnsOne
调用之后

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new CompanyEntityTypeConfiguraton());

    base.OnModelCreating(modelBuilder);

    modelBuilder.RemovePluralizingTableNameConvention();
    modelBuilder.OnDeleteCascading();
}

在2.1中,肯定有一些与所属类型相关的更改。您应该做的第一件事是创建新的迁移-如果它不是空的,那么是什么导致了EF核心映射的更改。例如,前两个modelBuilder调用是可疑的(尤其是第二个)-它们是非标准的EF核心方法,在将
EntityAddress
标识为所属实体之前调用。你能发布
OnDeleteCascading
方法的源代码吗?@IvanStoev我已经添加了
OnDeleteCascading
的代码。我在创建迁移后进行了更新。很好。事实上,我怀疑另一种方法,但幸运的是你已经包括了它:)
public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
{
    foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
    {
        entity.Relational().TableName = entity.DisplayName();
    }
}
modelBuilder.Model.GetEntityTypes().Where(t => !t.IsOwned())
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new CompanyEntityTypeConfiguraton());

    base.OnModelCreating(modelBuilder);

    modelBuilder.RemovePluralizingTableNameConvention();
    modelBuilder.OnDeleteCascading();
}