【问题标题】:What are EF Core 2.1 changes in owned types?EF Core 2.1 对自有类型的更改是什么?
【发布时间】:2018-07-28 16:48:53
【问题描述】:

Docs 最后更改于 2018 年 2 月 26 日,但我需要修复一些重大更改。

我有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 现在为空。

我需要 custom name convention 的名称。

【问题讨论】:

    标签: c# entity-framework-core ef-core-2.1


    【解决方案1】:

    到目前为止,唯一的官方更改(EF Core 2.1)是添加了[Owned] Attribute

    但是显然在实现中存在重大变化,因此DefiningEntityTypeDefiningNavigationName 属性不再可靠(无论如何它们都没有记录 - 只是“标准”生成无用“获取定义实体类型。 ""获取定义导航的名称。")。

    通过实验,我发现只有在拥有的类型用于多个实体时才会填充它们。不知道他们为什么这样做,但重点是我们不应该使用它们,而且 EF Core 代码本身似乎也不再使用它们了。

    据我所知,IsOwnedDefiningEntityTypeDefiningNavigationName 术语由具有等于 trueIsOwnership 属性的外键确定。

    换句话说:

    var ownershipFk = entityType.GetForeignKeys().FirstOrDefault(fk => fk.IsOwnership);
    var isOwned = ownershipFk != null;
    var definingEntityType = ownershipFk?.PrincipalEntityType;
    var definingNavigationName = ownershipFk?.PrincipalToDependent.Name;
    

    【讨论】:

      猜你喜欢
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      相关资源
      最近更新 更多