You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I know that there are quite some restricitons restrictions on owned entities but the docs don't handle yet well the possibilities on ForeignKeys, hence the question:
Let's assume I have a entity Configuration with many owned ConfigurationItem. I also have second entity Application with a navigation property ConfigurationItem ApplicationName.
I am using OwnsMany because I want to have a composition relation between the configuration and the items in it. It has some benefits in handling the data.
But the problem comes when another entity now rather want to reference the sub-items.
I was wondering if this scenario is supported or I have to go fully for classical relationships (HasMany) and handle the composition myself (.OnDelete(DeleteBehavior.Cascade)+.Include()). I face the following error in my setup when scaffolding a migration:
The entity type 'ConfigurationItem' cannot be configured as owned because it has already been configured as a non-owned. If you want to override previous configuration first remove the entity type from the model by calling 'Ignore'. See https://aka.ms/efcore-docs-owned for more information.
Would be nice if I can keep the OwnsMany but still have references. Otherwise I will needgo back to HasMany and need to extend my application logic everywhere.
Include your code
Use dotnet ef migrations add InitialCreate
using Microsoft.EntityFrameworkCore;
Console.WriteLine("Hello, World!");
public class Configuration
{
public Guid Id { get; set; }
public IList<ConfigurationItem> ConfigurationItems { get; set; } = new List<ConfigurationItem>();
}
public class ConfigurationItem
{
public Guid Id { get; set; }
public Guid ConfigurationId { get; set; }
public Configuration Configuration { get; set; } = null!;
public IList<Application>? ApplicationsUsingItemAsApplicationName { get; set; }
}
public class Application
{
public Guid Id { get; set; }
public Guid ApplicationNameConfigurationItemId { get; set; }
public ConfigurationItem? ApplicationNameConfigurationItem { get; set; }
}
public class ConfigDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Configuration>(c =>
{
c.OwnsMany(x => x.ConfigurationItems,
ci =>
{
ci.ToTable("ConfigurationItems");
ci.HasKey(x => x.Id);
ci.Property(x => x.Id).ValueGeneratedOnAdd().HasDefaultValueSql("NEWID()");
ci.WithOwner(x => x.Configuration)
.HasForeignKey(x => x.ConfigurationId);
});
});
modelBuilder.Entity<Application>(a =>
{
a.HasKey(x => x.Id);
a.Property(x => x.Id).ValueGeneratedOnAdd().HasDefaultValueSql("NEWID()");
a.HasOne(x => x.ApplicationNameConfigurationItem)
.WithMany(x => x.ApplicationsUsingItemAsApplicationName)
.HasForeignKey(x => x.ApplicationNameConfigurationItemId);
});
}
}
Include stack traces
Include the full exception message and stack trace for any exception you encounter.
Use triple-tick fences for stack traces. For example:
PS D:\Dev\Other\EFOwnedManyNavigation> dotnet ef migrations add InitialCreate --project EFOwnedManyNavigation
System.InvalidOperationException: The entity type 'ConfigurationItem' cannot be configured as non-owned because it has already been configured as a owned. Use the nested builder in `OwnsOne` or `OwnsMany` on the own
er entity type builder to further configure this type. If you want to override previous configuration first remove the entity type from the model by calling 'Ignore'. See https://aka.ms/efcore-docs-owned for more in
formation.
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.CanSetIsOwned(Boolean owned, ConfigurationSource configurationSource)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.IsOwned(Boolean owned, ConfigurationSource configurationSource, ForeignKey futureOwnership)
Include verbose output
PS D:\Dev\Other\EFOwnedManyNavigation> dotnet ef migrations add InitialCreate --project EFOwnedManyNavigation
Build started...
Build succeeded.
System.InvalidOperationException: The entity type 'ConfigurationItem' cannot be configured as non-owned because it has already been configured as a owned. Use the nested builder in `OwnsOne` or `OwnsMany` on the own
er entity type builder to further configure this type. If you want to override previous configuration first remove the entity type from the model by calling 'Ignore'. See https://aka.ms/efcore-docs-owned for more in
formation.
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.CanSetIsOwned(Boolean owned, ConfigurationSource configurationSource)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalEntityTypeBuilder.IsOwned(Boolean owned, ConfigurationSource configurationSource, ForeignKey futureOwnership)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalModelBuilder.Entity(TypeIdentity& type, ConfigurationSource configurationSource, Nullable`1 shouldBeOwned)
at Microsoft.EntityFrameworkCore.Metadata.Internal.InternalModelBuilder.Entity(Type type, ConfigurationSource configurationSource, Nullable`1 shouldBeOwned)
at Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder.FindRelatedEntityType(Type relatedType, String navigationName)
at Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder`1.HasOne[TRelatedEntity](Expression`1 navigationExpression)
at ConfigDbContext.<>c.<OnModelCreating>b__1_1(EntityTypeBuilder`1 a) in D:\Dev\Other\EFOwnedManyNavigation\EFOwnedManyNavigation\Program.cs:line 55
at Microsoft.EntityFrameworkCore.ModelBuilder.Entity[TEntity](Action`1 buildAction)
at ConfigDbContext.OnModelCreating(ModelBuilder modelBuilder) in D:\Dev\Other\EFOwnedManyNavigation\EFOwnedManyNavigation\Program.cs:line 50
at Microsoft.EntityFrameworkCore.Infrastructure.ModelCustomizer.Customize(ModelBuilder modelBuilder, DbContext context)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, ModelDependencies modelDependencies)
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, ModelCreationDependencies modelCreationDependencies, Boolean designTime)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel(Boolean designTime)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__8_4(IServiceProvider p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeReso
lverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeReso
lverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeReso
lverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeReso
lverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeReso
lverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeReso
lverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite callSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass2_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
at Microsoft.EntityFrameworkCore.DbContext.get_ContextServices()
at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
at Microsoft.EntityFrameworkCore.Infrastructure.Internal.InfrastructureExtensions.GetService[TService](IInfrastructure`1 accessor)
at Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService[TService](IInfrastructure`1 accessor)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType, String namespace)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_0.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
The entity type 'ConfigurationItem' cannot be configured as non-owned because it has already been configured as a owned. Use the nested builder in `OwnsOne` or `OwnsMany` on the owner entity type builder to further
configure this type. If you want to override previous configuration first remove the entity type from the model by calling 'Ignore'. See https://aka.ms/efcore-docs-owned for more information.
Include provider and version information
EF Core version: 6.0.1
Database provider: Microsoft.EntityFrameworkCore.SqlServer
Target framework: e.g. .NET 6.0
Operating system: Windows 11 Enterprise 21H2
IDE: CLI
The text was updated successfully, but these errors were encountered:
@Danielku15 An owned type is semantically considered part of an aggregate and cannot exist outside of that aggregate. The aggregate is loaded as a whole by reference to the aggregate root.
A relationship using HasMany will still be configured to cascade delete by default if the relationship is required, since a required relationship means that the dependents cannot exist in the database without a principal. For the Include part, this is tracked by Rule-based eager load (Include) (load patterns/LoadWith).
Ask a question
I know that there are quite some restricitons restrictions on owned entities but the docs don't handle yet well the possibilities on ForeignKeys, hence the question:
Let's assume I have a entity
Configuration
with many ownedConfigurationItem
. I also have second entityApplication
with a navigation propertyConfigurationItem ApplicationName
.I am using
OwnsMany
because I want to have a composition relation between the configuration and the items in it. It has some benefits in handling the data.But the problem comes when another entity now rather want to reference the sub-items.
I was wondering if this scenario is supported or I have to go fully for classical relationships (HasMany) and handle the composition myself (
.OnDelete(DeleteBehavior.Cascade)
+.Include()
). I face the following error in my setup when scaffolding a migration:Would be nice if I can keep the
OwnsMany
but still have references. Otherwise I will needgo back toHasMany
and need to extend my application logic everywhere.Include your code
Use
dotnet ef migrations add InitialCreate
Include stack traces
Include the full exception message and stack trace for any exception you encounter.
Use triple-tick fences for stack traces. For example:
Include verbose output
Include provider and version information
EF Core version: 6.0.1
Database provider: Microsoft.EntityFrameworkCore.SqlServer
Target framework: e.g. .NET 6.0
Operating system: Windows 11 Enterprise 21H2
IDE: CLI
The text was updated successfully, but these errors were encountered: