我可以先对DB使用重写OnModelCreating方法吗

时间:2019-05-07 00:20:21

标签: c# asp.net-mvc

我正在尝试将asp.net身份集成到我现有的项目中,首先我正在使用数据库,我没有使用edmx来生成模型和上下文类,而是我自己创建模型,

现在我的问题是:我可以在DbContext类中使用“重写OnModelCreating”方法吗?或者它仅可用于代码优先方法

1 个答案:

答案 0 :(得分:1)

是的,您绝对可以。 毕竟,DbContext只是数据的面向对象模型。如果发电机为您架设了支架,或者您手动手工制造,则无需担心。我本人沿着那条路线走。 该数据库已经存在,并通过.sqlproj项目进行维护,尽管它首先以代码形式启动,但我还是中途进行了切换。

作为一个实际例子。我正在使用OnModelCreating来配置我的实体:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        //extracted m:n mapping for demonstration puporses
        builder.Entity<AppUserRole>(userRole =>
        {
            userRole.HasKey(ur => new { ur.UserId, ur.RoleId });
            userRole.HasOne(ur => ur.Role)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();

            userRole.HasOne(ur => ur.User)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });

        builder.ApplyConfiguration(new AppUserConfiguration());
        builder.ApplyConfiguration(new MapConfigConfiguration());
        builder.ApplyConfiguration(new MapWidgetConfiguration());
        builder.ApplyConfiguration(new WidgetConfiguration());
        builder.ApplyConfiguration(new LayoutMenuConfiguration());
        builder.ApplyConfiguration(new ImageConfiguration());
        builder.ApplyConfiguration(new FrontPageContentConfiguration());
    }
}

要开始使用,您可以使用Nuget控制台搭建现有数据库:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Foo;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

然后根据需要调整它。因此,如果您将json存储在nvarchar字段中,请添加一次转换以自动将其映射到具体类型:

public class LayerConfigurationConfiguration : IEntityTypeConfiguration<LayerConfiguration>
{
    public void Configure(EntityTypeBuilder<LayerConfiguration> builder)
    {
        builder.HasKey(lc => lc.Id);
        /* ... */
        builder.Property(lc => lc.LayerConfig).HasConversion(
            v => JsonConvert.SerializeObject(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),
            v => JsonConvert.DeserializeObject<LayerConfig>(v)
        );
    }
}

参考:https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db