Details
-
Bug
-
Resolution: Done
-
Unknown
-
None
-
None
-
None
Description
If you try to modify the element name for an owned entity, an InvalidOperationException is thrown.
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore.Metadata.Conventions;
|
using MongoDB.Bson;
|
using MongoDB.Driver;
|
using MongoDB.EntityFrameworkCore.Extensions;
|
using MongoDB.EntityFrameworkCore.Metadata.Conventions;
|
|
|
var client = new MongoClient("mongodb://localhost:27017");
|
|
|
using var db = CustomerDbContext.Create(client.GetDatabase("test"));
|
|
|
var oldOnes = db.Customers.AsQueryable().ToList();
|
db.Customers.RemoveRange(oldOnes);
|
|
|
db.Customers.Add(new Customer
|
{ FirstName = "Sally", LastName = "Smith", BillingAddress = new Location { Street = "123 Street" } });
|
db.SaveChanges();
|
|
|
var sally = db.Customers.First(x => x.FirstName == "Sally");
|
sally.LastName = "Smythe";
|
db.SaveChanges();
|
Console.WriteLine(sally);
|
|
|
class Customer
|
{
|
public ObjectId Id { get; set; }
|
public string FirstName { get; set; }
|
public string LastName { get; set; }
|
public Location BillingAddress { get; set; }
|
public override string ToString() => $"{FirstName} {LastName} ({Id})";
|
}
|
|
|
class Location
|
{
|
public string Street { get; set; }
|
public string City { get; set; }
|
public string Province { get; set; }
|
public string Country { get; set; }
|
}
|
|
|
class CustomerDbContext : DbContext
|
{
|
public DbSet<Customer> Customers { get; init; }
|
|
|
public static CustomerDbContext Create(IMongoDatabase database)
|
{
|
return new CustomerDbContext(new DbContextOptionsBuilder<CustomerDbContext>()
|
.UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
|
.Options);
|
}
|
|
|
public CustomerDbContext(DbContextOptions options) : base(options)
|
{
|
}
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
{
|
base.OnModelCreating(modelBuilder);
|
|
|
var customerModelBuilder = modelBuilder.Entity<Customer>();
|
customerModelBuilder.ToCollection("customers");
|
customerModelBuilder.Property(x => x.BillingAddress).HasElementName("billingAddress");
|
}
|
}
|
Here's the exception with stack trace:
Unhandled exception. System.InvalidOperationException: The 'Location' property 'Customer.BillingAddress' could not be mapped because the database provider does not support this type. Consider converting the property value to a type supported by the database using a value converter. See https://aka.ms/efcore-docs-value-converters for more information. Alternately, exclude the property from the model using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.
|
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ThrowPropertyNotMappedException(String propertyType, IConventionEntityType entityType, IConventionProperty unmappedProperty)
|
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidatePropertyMapping(IModel model, IDiagnosticsLogger`1 logger)
|
at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
|
at MongoDB.EntityFrameworkCore.Infrastructure.MongoModelValidator.Validate(IModel model, IDiagnosticsLogger`1 logger)
|
at Microsoft.EntityFrameworkCore.Infrastructure.ModelRuntimeInitializer.Initialize(IModel model, Boolean designTime, IDiagnosticsLogger`1 validationLogger)
|
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, RuntimeResolverLock 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, RuntimeResolverLock 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, RuntimeResolverLock 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, RuntimeResolverLock 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, RuntimeResolverLock 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, RuntimeResolverLock 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_Model()
|
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()
|
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.CheckState()
|
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()
|
at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator()
|
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
|
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
|
at Program.<Main>$(String[] args) in /Users/james/Dropbox/code/cases/EfCoreExample/Program.cs:line 12
|