EF Core 2.1 对自有类型的更改是什么?
What are EF Core 2.1 changes in owned types?
Docs 上次更改时间为 02/26/2018,但我需要修复一些重大更改。
我有 MyProcessContext
类型,用于许多实体:
public class RequestData
{
public Guid CorrelationId { get; set; }
public DateTime Updated { get; set; }
public MyProcessContext ProcessContext { get; set; }
}
public class MyProcessContext
{
public int ClientId { get; set; }
}
public class EntityConfiguration : IEntityTypeConfiguration<RequestData>
{
public void Configure(EntityTypeBuilder<RequestData> builder)
{
// all mapped by convention
builder.OwnsOne(x => x.ProcessContext);
builder.Property(x => x.Updated).IsRowVersion();
builder.HasKey(x => x.CorrelationId);
builder.Property(x => x.CorrelationId).ValueGeneratedNever();
}
}
它与 EF Core 2.0 一起正常工作。在调试视图中,我对拥有类型 (RequestData.ProcessContext#MyProcessContext
) 的每次使用都有不同的实体类型:
EntityType: RequestData
Properties:
CorrelationId (Guid) Required PK AfterSave:Throw 0 0 0 -1 -1
Annotations:
Relational:ColumnName: correlation_id
Updated (DateTime) Required Concurrency BeforeSave:Ignore AfterSave:Ignore ValueGenerated.OnAddOrUpdate 11 11 -1 -1 0
Annotations:
Relational:ColumnName: updated
Navigations:
ProcessContext (<ProcessContext>k__BackingField, MyProcessContext) ToDependent RequestData.ProcessContext#MyProcessContext 0 -1 1 -1 -1
Keys:
CorrelationId PK
Annotations:
Relational:TableName: process_request
RelationshipDiscoveryConvention:NavigationCandidates: System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]
EntityType: RequestData.ProcessContext#MyProcessContext
Properties:
RequestDataCorrelationId (no field, Nullable<Guid>) Shadow Required PK FK AfterSave:Throw 0 0 0 0 -1
ClientId (int) Required 1 1 -1 -1 -1
Keys:
RequestDataCorrelationId PK
Foreign keys:
RequestData.ProcessContext#MyProcessContext {'RequestDataCorrelationId'} -> RequestData {'CorrelationId'} Unique ToDependent: ProcessContext
Annotations:
Relational:TableName: process_request
RelationshipDiscoveryConvention:NavigationCandidates: System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]
升级后调试视图包含
EntityType: RequestData
...
ProcessContext (<ProcessContext>k__BackingField, MyProcessContext) ToDependent MyProcessContext 0 -1 1 -1 -1
...
EntityType: MyProcessContext
Properties:
RequestDataCorrelationId (no field, Guid) Shadow Required PK FK AfterSave:Throw 0 0 0 0 -1
ClientId (int) Required 1 1 -1 -1 -1
Keys:
RequestDataCorrelationId PK
Foreign keys:
MyProcessContext {'RequestDataCorrelationId'} -> RequestData {'CorrelationId'} Unique Ownership ToDependent: ProcessContext
Annotations:
Relational:TableName: process_request
RelationshipDiscoveryConvention:NavigationCandidates: System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]
像MyProcessContext
这样构建的模型是通常的实体。在像
这样的代码中
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
var entityIsOwned = entity.IsOwned();
entityIsOwned
为真,但 entity.DefiningNavigationName
现在为空。
我需要 的名称。
到目前为止 (EF Core 2.1) 唯一的官方变化是添加了 [Owned] Attribute。
然而显然在实现中有重大变化,所以 DefiningEntityType
和 DefiningNavigationName
属性不再可靠(无论如何它们都没有记录 - 只是 "standard" 生成无用 "Gets the defining entity type." 和 "Gets the name of the defining navigation.")。
通过实验,我发现只有当拥有的类型在多个实体中使用时,它们才会被填充。不知道他们为什么这样做,但重点是我们不应该使用它们,而且 EF Core 代码本身似乎也不再使用它们了。
据我所知,IsOwned
、DefiningEntityType
和 DefiningNavigationName
项由 IsOwnership
属性 等于 [=17] 的外键决定=].
换句话说:
var ownershipFk = entityType.GetForeignKeys().FirstOrDefault(fk => fk.IsOwnership);
var isOwned = ownershipFk != null;
var definingEntityType = ownershipFk?.PrincipalEntityType;
var definingNavigationName = ownershipFk?.PrincipalToDependent.Name;
Docs 上次更改时间为 02/26/2018,但我需要修复一些重大更改。
我有 MyProcessContext
类型,用于许多实体:
public class RequestData
{
public Guid CorrelationId { get; set; }
public DateTime Updated { get; set; }
public MyProcessContext ProcessContext { get; set; }
}
public class MyProcessContext
{
public int ClientId { get; set; }
}
public class EntityConfiguration : IEntityTypeConfiguration<RequestData>
{
public void Configure(EntityTypeBuilder<RequestData> builder)
{
// all mapped by convention
builder.OwnsOne(x => x.ProcessContext);
builder.Property(x => x.Updated).IsRowVersion();
builder.HasKey(x => x.CorrelationId);
builder.Property(x => x.CorrelationId).ValueGeneratedNever();
}
}
它与 EF Core 2.0 一起正常工作。在调试视图中,我对拥有类型 (RequestData.ProcessContext#MyProcessContext
) 的每次使用都有不同的实体类型:
EntityType: RequestData
Properties:
CorrelationId (Guid) Required PK AfterSave:Throw 0 0 0 -1 -1
Annotations:
Relational:ColumnName: correlation_id
Updated (DateTime) Required Concurrency BeforeSave:Ignore AfterSave:Ignore ValueGenerated.OnAddOrUpdate 11 11 -1 -1 0
Annotations:
Relational:ColumnName: updated
Navigations:
ProcessContext (<ProcessContext>k__BackingField, MyProcessContext) ToDependent RequestData.ProcessContext#MyProcessContext 0 -1 1 -1 -1
Keys:
CorrelationId PK
Annotations:
Relational:TableName: process_request
RelationshipDiscoveryConvention:NavigationCandidates: System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]
EntityType: RequestData.ProcessContext#MyProcessContext
Properties:
RequestDataCorrelationId (no field, Nullable<Guid>) Shadow Required PK FK AfterSave:Throw 0 0 0 0 -1
ClientId (int) Required 1 1 -1 -1 -1
Keys:
RequestDataCorrelationId PK
Foreign keys:
RequestData.ProcessContext#MyProcessContext {'RequestDataCorrelationId'} -> RequestData {'CorrelationId'} Unique ToDependent: ProcessContext
Annotations:
Relational:TableName: process_request
RelationshipDiscoveryConvention:NavigationCandidates: System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]
升级后调试视图包含
EntityType: RequestData
...
ProcessContext (<ProcessContext>k__BackingField, MyProcessContext) ToDependent MyProcessContext 0 -1 1 -1 -1
...
EntityType: MyProcessContext
Properties:
RequestDataCorrelationId (no field, Guid) Shadow Required PK FK AfterSave:Throw 0 0 0 0 -1
ClientId (int) Required 1 1 -1 -1 -1
Keys:
RequestDataCorrelationId PK
Foreign keys:
MyProcessContext {'RequestDataCorrelationId'} -> RequestData {'CorrelationId'} Unique Ownership ToDependent: ProcessContext
Annotations:
Relational:TableName: process_request
RelationshipDiscoveryConvention:NavigationCandidates: System.Collections.Immutable.ImmutableSortedDictionary`2[System.Reflection.PropertyInfo,System.Type]
像MyProcessContext
这样构建的模型是通常的实体。在像
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
var entityIsOwned = entity.IsOwned();
entityIsOwned
为真,但 entity.DefiningNavigationName
现在为空。
我需要
到目前为止 (EF Core 2.1) 唯一的官方变化是添加了 [Owned] Attribute。
然而显然在实现中有重大变化,所以 DefiningEntityType
和 DefiningNavigationName
属性不再可靠(无论如何它们都没有记录 - 只是 "standard" 生成无用 "Gets the defining entity type." 和 "Gets the name of the defining navigation.")。
通过实验,我发现只有当拥有的类型在多个实体中使用时,它们才会被填充。不知道他们为什么这样做,但重点是我们不应该使用它们,而且 EF Core 代码本身似乎也不再使用它们了。
据我所知,IsOwned
、DefiningEntityType
和 DefiningNavigationName
项由 IsOwnership
属性 等于 [=17] 的外键决定=].
换句话说:
var ownershipFk = entityType.GetForeignKeys().FirstOrDefault(fk => fk.IsOwnership);
var isOwned = ownershipFk != null;
var definingEntityType = ownershipFk?.PrincipalEntityType;
var definingNavigationName = ownershipFk?.PrincipalToDependent.Name;