由于某些原因,代码优先EF7(vNext)不会使用/找到我的表的复数形式。我已经尝试将table属性添加到模型中,但它无法解决问题。
[Table("Units")]
public class Unit
如果我将表命名为Unit那么没问题。如果我将表命名为Units,则找不到它。
我做错了什么或错过了什么?
谢谢。
答案 0 :(得分:3)
这是我解决的问题:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Unit>().ToTable("Units");
}
答案 1 :(得分:3)
对于Entity Framework 7 beta1,我通过这种方式解决了这个问题:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Unit>().ForRelational(rb =>
{
rb.Table("Units");
});
}
答案 2 :(得分:1)
正在使用Fluent API配置Entity Framework 7。我创建了一个扩展方法,将表名映射到复数形式,目的是重现EF 6行为,并能够在使用EF7时使用我现有的数据库。
public static class ModelBuilderExtensions
{
public static void PluralizeNames(this ModelBuilder modelBuilder)
{
var types = modelBuilder.Model.EntityTypes;
foreach (var type in types.Where(type => type.ClrType != null))
{
modelBuilder.Entity(type.ClrType)
.ForRelational()
.Table(type.ClrType.Name.Split('`')[0].Pluralize());
};
}
}
请注意.Pluralize()
扩展方法。这可能是您正在使用的Humanizer或任何其他使您的字符串复数化的扩展方法。 (我无耻地在我的项目中复制了https://github.com/srkirkland/Inflector/blob/master/Inflector/Inflector.cs,以便能够使用DNX Core编译我的项目。)
.Split()
部分是处理type.ClrType.Name
,它可以输出 IdentityUserRole`1 等内容。
您可以在DbContext
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.PluralizeNames();
}
诗;这对我有用
答案 3 :(得分:0)
现在,EF7的beta5中缺少ToTable和ForRelational。所以我使用了下面的代码。
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Role>().ForSqlServer().Table("Role");
}
答案 4 :(得分:0)
您需要在project.json中添加“Microsoft.EntityFrameworkCore.Relational”并恢复您的包。 .NET核心被分解成小块,以减少内存占用。所以你需要明确告诉你想要什么。