我正在尝试将asp.net身份集成到我现有的项目中,首先我正在使用数据库,我没有使用edmx来生成模型和上下文类,而是我自己创建模型,
现在我的问题是:我可以在DbContext类中使用“重写OnModelCreating”方法吗?或者它仅可用于代码优先方法
答案 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