L' ultima modifica di Documenti è stata effettuata in data 26/02/2018, ma è necessario apportare alcune modifiche urgenti.
Ho il tipo MyProcessContext
, usato come di proprietà per molte entità:
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();
}
}
Funziona come previsto con EF Core 2.0. Nella vista di debug, ho un tipo di entità differente per ogni utilizzo del tipo di proprietà ( 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]
Dopo aver completato la vista di debug dell'aggiornamento
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]
Il modello creato come MyProcessContext
è un'entità normale. In codice come
foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
var entityIsOwned = entity.IsOwned();
entityIsOwned
è true, ma entity.DefiningNavigationName
è ora nullo.
Ho bisogno di quel nome per la convenzione dei nomi personalizzati .
L'unica modifica ufficiale finora (EF Core 2.1) è l'aggiunta dell'attributo [Owned] .
Tuttavia a quanto pare ci sono cambiamenti irrazionali nell'implementazione, quindi le proprietà DefiningEntityType
e DefiningNavigationName
non sono più affidabili (non sono comunque documentate - solo lo "standard" generato inutile "Ottiene il tipo di entità definente." E "Ottiene il nome della navigazione di definizione . " ).
Per esperimento ho scoperto che sono popolati solo se il tipo di proprietà è utilizzato in più di un'entità. Non sono sicuro del motivo per cui lo fanno, ma il punto principale è che non dovremmo usarli, inoltre il codice EF Core stesso sembra non utilizzarli più.
Da quello che ho visto, i termini IsOwned
, DefiningEntityType
e DefiningNavigationName
sono determinati dalla chiave IsOwnership
proprietà IsOwnership
uguale a true
.
In altre parole:
var ownershipFk = entityType.GetForeignKeys().FirstOrDefault(fk => fk.IsOwnership);
var isOwned = ownershipFk != null;
var definingEntityType = ownershipFk?.PrincipalEntityType;
var definingNavigationName = ownershipFk?.PrincipalToDependent.Name;