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

标签 c# entity-framework-core asp.net-core-2.1 value-objects

我一直在asp.net core 2.0项目中使用值对象,该项目在该项目上运行正常。

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

对象名称“EntityAdress”无效。

实体:

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

ValueObject 的实现与 Link for the eshopContainer examples of value objects 完全相同。

我用于包含DbContext的项目的包

<Project Sdk="Microsoft.NET.Sdk">


  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeFrameworkVersion>2.1.6</RuntimeFrameworkVersion>
  </PropertyGroup>


  <ItemGroup>
    <PackageReference Include="IdentityServer4.AspNetIdentity" Version="1.0.1" />
    <PackageReference Include="IdentityServer4.EntityFramework" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.0" />
    <PackageReference Include="Microsoft.Extensions.Logging" Version="2.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
  </ItemGroup>
</Project>

上下文:

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

    }
}

OnDeleteCascading 和RemovePluralizingTableNameConvention:

public static class ModelBuilderExtensions
{
    public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
    {
        foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
        {
            entity.Relational().TableName = entity.DisplayName();
        }
    }
    public static void OnDeleteCascading(this ModelBuilder modelBuilder)
    {
        foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
        {
            relationship.DeleteBehavior = DeleteBehavior.Restrict;
        }
    }

}

问题的原因可能是什么?是 Entity Framework 版本的问题还是实现中缺少的东西?

最佳答案

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

问题是这段代码:

public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
{
    foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
    {
        entity.Relational().TableName = entity.DisplayName();
    }
}

首先,您应该排除自有类型(请记住自有类型仍然是 EF Core 中的实体,因此包含在 GetEntityTypes() 中):

modelBuilder.Model.GetEntityTypes().Where(t => !t.IsOwned())

否则,您将更改 EF Core 的默认行为,即不为拥有的实体创建单独的表(所谓的表拆分),以实际创建单独的表,因此当 EF Core 构建 SQL 查询联接到表不存在。

其次,您应该在所有流畅配置之后调用该代码,因为在开始时,拥有的实体(如果没有标记[Owned]属性)不是尚未确定 - 它仅在 OwnsOne 调用之后发生。

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

    base.OnModelCreating(modelBuilder);

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

关于c# - asp.net core 2.1 中的值对象作为无效对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53801640/

相关文章:

c# - Angular 7 到 dotnetcore 2.1 web api 调用没有响应

c# - 调用 Facebook/Google+ 时 ExternalLogin 未命中

c# - 将数字与整数分开(无字符串函数)

c# - Asp.Net Core 1.0.0 : Npgsql. EntityFrameworkCore.PostgreSQL 迁移错误

c# - 将对象转换为对象的单项数组 (C#)

c# - 找不到实体类型。确保实体类型已添加到模型中

asp.net - 如何更新 Entity Framework 7 中的多对多关系?

c# - 如何在 ASP.NET Core 中转换 AppSettings

c# - 在 XAML 中设置命令目标

C# - 在未完成时显示加载?