将 efCore 从 2.2 更新到 3.1 时拥有的实体
Owned Entities when updating efCore from 2.2 to 3.1
我正在将基于 DDD 设计原则的现有项目从 efcore 2.2 迁移到 efcore 3.1。数据库设置基于 Julie Lerman 几年前写的系列文章。
总的来说这很好,但我正在努力解决拥有实体的问题,尤其是这条错误消息:
InvalidOperationException: The type 'ApplicationCore.Entities.UserAggregate.Email' cannot be configured as non-owned because an owned entity type with the same name already exists
这两个实体是:
public class User
{
public int Id { get; private set; }
public Guid GuidId { get; private set; }
public Email Email {get; private set;}
}
它是 "owned" 实体
public class Email
{
public string Address { get; private set; }
}
以前在 EfCore 2.2 中的配置是:
private static void ConfigureUser(EntityTypeBuilder<User> builder)
{
builder.HasKey(s => s.Id);
builder.Property(s => s.GuidId)
.IsRequired();
builder.OwnsOne(u => u.Email);
}
据我所知,我应该在 efcore3.1 中做的是将其更新为:
private static void ConfigureUser(EntityTypeBuilder<User> builder)
{
builder.HasKey(s => s.Id);
builder.Property(s => s.GuidId)
.IsRequired();
builder.OwnsOne(u => u.Email).WithOwner();
}
除此配置方法外,OnModelCreating()
方法
中的其他实体还有多个配置方法
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<ForecastSetup>(ConfigureForecastSetup);
…
builder.Entity<User>(ConfigureUser);
// Remove internal property
foreach (var entityType in builder.Model.GetEntityTypes())
{
builder.Entity(entityType.Name).Ignore("IsDirty");
}
}
将从 builder.Entity(entityType.Name).Ignore("IsDirty")
行抛出异常。
就是这样。然而,这使得差异为零并且再次出现相同的错误。
我无法 运行 添加迁移来测试是否有其他设置,因为异常被抛出,我不确定如果我删除 ContextModelSnapshot 会发生什么......
感谢@IvanStoev,请参阅他在评论中链接到的问题。
配置正确,我的问题是在尝试删除 Shadow 时出现的 属性
// Remove shadow property for entities which are not owned
foreach (var entityType in builder.Model.GetEntityTypes().Where(e => !e.IsOwned()))
{
builder.Entity(entityType.Name).Ignore("IsDirty");
}
我正在将基于 DDD 设计原则的现有项目从 efcore 2.2 迁移到 efcore 3.1。数据库设置基于 Julie Lerman 几年前写的系列文章。
总的来说这很好,但我正在努力解决拥有实体的问题,尤其是这条错误消息:
InvalidOperationException: The type 'ApplicationCore.Entities.UserAggregate.Email' cannot be configured as non-owned because an owned entity type with the same name already exists
这两个实体是:
public class User
{
public int Id { get; private set; }
public Guid GuidId { get; private set; }
public Email Email {get; private set;}
}
它是 "owned" 实体
public class Email
{
public string Address { get; private set; }
}
以前在 EfCore 2.2 中的配置是:
private static void ConfigureUser(EntityTypeBuilder<User> builder)
{
builder.HasKey(s => s.Id);
builder.Property(s => s.GuidId)
.IsRequired();
builder.OwnsOne(u => u.Email);
}
据我所知,我应该在 efcore3.1 中做的是将其更新为:
private static void ConfigureUser(EntityTypeBuilder<User> builder)
{
builder.HasKey(s => s.Id);
builder.Property(s => s.GuidId)
.IsRequired();
builder.OwnsOne(u => u.Email).WithOwner();
}
除此配置方法外,OnModelCreating()
方法
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<ForecastSetup>(ConfigureForecastSetup);
…
builder.Entity<User>(ConfigureUser);
// Remove internal property
foreach (var entityType in builder.Model.GetEntityTypes())
{
builder.Entity(entityType.Name).Ignore("IsDirty");
}
}
将从 builder.Entity(entityType.Name).Ignore("IsDirty")
行抛出异常。
就是这样。然而,这使得差异为零并且再次出现相同的错误。
我无法 运行 添加迁移来测试是否有其他设置,因为异常被抛出,我不确定如果我删除 ContextModelSnapshot 会发生什么......
感谢@IvanStoev,请参阅他在评论中链接到的问题。
配置正确,我的问题是在尝试删除 Shadow 时出现的 属性
// Remove shadow property for entities which are not owned
foreach (var entityType in builder.Model.GetEntityTypes().Where(e => !e.IsOwned()))
{
builder.Entity(entityType.Name).Ignore("IsDirty");
}