我们正在将一个中等规模的应用程序从Entity Framework 6.2迁移到Entity Framework Core 2.0。虽然许多事情比我所希望的要容易,但我遇到了一个问题,我怀疑我不是第一个(或第一千个)遇到这个问题的人,但找不到一个简洁的解决方案: 命名约定。
具体来说,关系属性的命名约定。
在我们的应用程序中,典型的一对多实体对看起来像这样:
在我们现有的数据库中,EF6将其映射到以下表:
使用EF Core的默认命名约定时,转换后的上下文似乎会查找列
我尝试了一些描述在这里的修改方法,但我无法弄清楚如何对属性元数据施加仅更改导航属性的条件。(我还有一些复合类型,使用
是否没有现成的解决方案,可以使此过渡更容易?
我已经发布了一个此问题的最小可重现示例(MVCE): https://github.com/tlycken/MCVE_EfCoreNavigationalProperties
具体来说,关系属性的命名约定。
在我们的应用程序中,典型的一对多实体对看起来像这样:
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; }
}
在我们现有的数据库中,EF6将其映射到以下表:
Foos Bazzes -- named after the DbSets on the DbContext
**** ******
FooId : int BazId : int
Bar : nvarchar(max) Qux : nvarchar(max)
Foo_FooId : int
使用EF Core的默认命名约定时,转换后的上下文似乎会查找列
FooId
而不是Foo_FooId
。我尝试了一些描述在这里的修改方法,但我无法弄清楚如何对属性元数据施加仅更改导航属性的条件。(我还有一些复合类型,使用
.Entity<Owner>().OwnsOne(o => o.Owned)
进行配置,因此解决方案需要捕获该部分。)是否没有现成的解决方案,可以使此过渡更容易?
我已经发布了一个此问题的最小可重现示例(MVCE): https://github.com/tlycken/MCVE_EfCoreNavigationalProperties