Ho utilizzato object object nel progetto asp.net core 2.0, che funzionava correttamente su quel progetto.
Ho aggiornato il progetto a 2.1 e mi sta dando un errore come
Invalid object name 'EntityAdress'.
Entità:
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;
}
}
L'implementazione per ValueObject è la stessa esatta dal collegamento per gli esempi eshopContainer di oggetti valore
Il pacchetto che sto usando per i progetti che contiene 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>
Contesto:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.RemovePluralizingTableNameConvention();
modelBuilder.OnDeleteCascading();
modelBuilder.ApplyConfiguration(new CompanyEntityTypeConfiguraton());
base.OnModelCreating(modelBuilder);
}
CompanyEntityTypeConfiguraton:
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 e 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;
}
}
}
Quale potrebbe essere la ragione dei problemi? È il problema con la versione di Entity Framework o qualcosa che manca nelle implementazioni?
Ci sono sempre alcuni cambiamenti nell'implementazione tra le versioni di EF Core. Alcuni potrebbero essere correzioni di errori, che possono causare l'esecuzione del codice vecchio in modo diverso.
Il problema è questo codice:
public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
entity.Relational().TableName = entity.DisplayName();
}
}
Innanzitutto, dovresti escludere i tipi di proprietà (ricorda che i tipi di proprietà sono ancora entità in EF Core, quindi sono inclusi in GetEntityTypes()
):
modelBuilder.Model.GetEntityTypes().Where(t => !t.IsOwned())
altrimenti si sta modificando il comportamento predefinito di EF Core di non creare una tabella separata per l'entità di proprietà (la cosiddetta divisione della tabella) per creare effettivamente una tabella separata, quindi l'eccezione che si ottiene quando EF Core crea una query SQL che si unisce alla tabella che esegue non esiste.
In secondo luogo, dovresti chiamare quel codice dopo tutta la fluente configurazione, perché all'inizio le entità di proprietà (nel caso non siano contrassegnate con l'attributo [Owned]
) non sono ancora identificate come tali - accade solo dopo OwnsOne
chiamate OwnsOne
.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new CompanyEntityTypeConfiguraton());
base.OnModelCreating(modelBuilder);
modelBuilder.RemovePluralizingTableNameConvention();
modelBuilder.OnDeleteCascading();
}