0

Wir sind dabei, unsere relativ große Anwendung von Entity Framework 6.2 auf Entity Framework Core 2.0 zu migrieren, und obwohl vieles einfacher war, als ich es mir erhofft hatte, Ich bin auf ein Problem gestoßen, von dem ich bezweifle, dass ich der erste (oder der tausendste) bin, aber ich kann keine kompakte Lösung dafür finden: Namenskonventionen.Erneutes Erstellen von Namenskonventionen für EF6 in EF Core

Konkret Namenskonventionen für relationale Eigenschaften.

Ein typisches One-to-many Paar Unternehmen in unserer Anwendung etwas wie folgt aussehen:

public class Foo 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int FooId { get; set; } 

    [Required] 
    public string Bar { get; set; } 

    [InverseProperty(nameof(Baz.Foo))] 
    public ICollection<Baz> Bazzes { get; set; } 
} 

public class Baz 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int BazId { get; set; } 

    [Required] 
    public string Qux { get; set; } 

    [Required] 
    public Foo Foo { get; set; } 
} 

In unserer bestehenden Datenbank abgebildet EF6, dass in den folgenden Tabellen:

Foos      Bazzes -- named after the DbSets on the DbContext 
****      ****** 
FooId : int     BazId : int 
Bar : nvarchar(max)   Qux : nvarchar(max) 
          Foo_FooId : int 

Mit der Standardnamenskonventionen in EF Core scheint es, dass der portierte Kontext nach einer Spalte FooId statt Foo_FooId sucht.

Ich habe versucht, dies mit etwas zu ändern, was beschrieben wird here, aber ich kann nicht herausfinden, welche Bedingung auf die Eigenschaft Metadaten auferlegt werden, nur die Navigationseigenschaften zu ändern. (Ich habe auch ein paar komplexe Art, die ich mit .Entity<Owner>().OwnsOne(o => o.Owned) konfiguriere, also muss die Lösung auch das erfassen.)

Gibt es keine fertige Lösung, um diesen Übergang zu erleichtern?


Ich habe eine MVCE für dieses Problem hier veröffentlicht: https://github.com/tlycken/MCVE_EfCoreNavigationalProperties

+0

Soweit ich weiß, nein. Bei der Migration (zu EF Core 1.0) haben wir die Datenbank gerüstet und den Code entsprechend angepasst. Ich kann keine Beiträge finden, die andeuten, dass sich dies in irgendeiner Weise verbessert hat. – Tubs

Antwort

0

AFAIK Sie können den Namen des Shadow-Eigenschaft ändern, aber Sie können den Namen der Tabellenspalte ändern. Gefällt Ihnen

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 

    base.OnModelCreating(modelBuilder); 

    //modelBuilder.Model.FindEntityType(typeof(Baz)).FindProperty("FooId").Relational().ColumnName = "Foo_FooId"; 
    foreach(var m in modelBuilder.Model.GetEntityTypes()) 
    { 
     foreach (var sp in m.GetProperties().Where(p => p.IsShadowProperty)) 
     { 
      var fk = sp.GetContainingForeignKeys().Where(f => f.Properties.Count == 1).FirstOrDefault(); 
      if (fk != null && fk.PrincipalKey.Properties.Count == 1) 
      { 
       sp.Relational().ColumnName = fk.PrincipalEntityType.Relational().TableName + "_" + fk.PrincipalKey.Properties.Single().Relational().ColumnName; 
      } 
     } 
    } 

} 

Natürlich, wenn Sie eine Fremdschlüsseleigenschaft in Ihrem Modell haben, müssten Sie dies nicht tun.

+0

Danke. Ich konnte jetzt damit herumspielen, aber ich kann es aus mehreren Gründen nicht zum Laufen bringen: Ihr Code geht davon aus, dass das Präfix der Tabellenname der anderen Entität ist, aber in Wirklichkeit sollte es das sein property name auf _this_ entity (zB wenn wir eine Entität vom Typ 'Foo' mit einer Navigationseigenschaft vom Typ' Bar' namens 'Baz' haben, sollte die Spalte in der' Foos' Tabelle 'Baz_Bar' sein) und ich kann nicht Finde heraus, wie du den Namen der Immobilie findest. –

+0

Ich habe auch versucht, die Navigationseigenschaft mit '[ForeignKey (" TheDesiredColumnName ")]' zu notieren, was den Namen korrekt aufzulösen scheint, aber 'Include' hört auf zu arbeiten (ich bekomme' null' für alle relationalen Parameter). Es gibt einen Fremdschlüssel in der Datenbank, aber das scheint nicht zu helfen. –

+0

Außerdem habe ich eine minimale Beispiel-App zusammengestellt, die das Problem hier demonstriert: https://github.com/tlycken/MCVE_EfCoreNavigationalProperties –