Jer*_*acs 3 c# entity-framework entity-framework-core asp.net-core
在 NHibernate 中,他们有一个漂亮的小约定概念,你可以说,如果一个实体有一个Name属性,并且它是一个字符串,你可以对它应用某些数据库行为(例如,将它设置为非空,最大长度x,如果您可以确定所有名称都是唯一的,则可能是唯一的)。
这将是一个小班级,您可以将其添加到您的实例工厂中,然后砰!db 模型将相应地构建。
EF Core 中是否有类似的机制?我似乎无法为每个属性的每个实体找到任何可笑的流畅配置数量,这非常乏味。
在 EF Core 中,内置约定用于创建初始模型,您可以在 OnModelCreating 中覆盖或修改该模型。
您可以简单地遍历您的实体和属性覆盖约定。这足以代替来自 EF6 的自定义约定,(至少到目前为止)自定义约定还没有从 backlog 中删除。有关状态和一些示例,请参阅https://github.com/aspnet/EntityFrameworkCore/issues/214。在 OnModelCreating 中读取自定义属性以驱动(或覆盖)您的实体配置也是一种非常常见的模式。
所以你的例子:
如果实体具有 Name 属性,并且它是一个字符串,则您可以对其应用某些 db 行为(例如,将其设置为非空、最大长度 x,如果您可以确定所有名称都是唯一的,则可能是唯一的)。
会是这样的:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var props = from e in modelBuilder.Model.GetEntityTypes()
from p in e.GetProperties()
where p.Name == "Name"
&& p.PropertyInfo.PropertyType == typeof(string)
select p;
foreach (var p in props)
{
p.SetMaxLength(200);
p.IsNullable = false;
p.DeclaringEntityType.AddKey(p);
}
base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想强制所有 DataTime 列的数据类型,例如:
var dateProps = from e in modelBuilder.Model.GetEntityTypes()
from p in e.GetProperties()
where p.PropertyInfo.PropertyType == typeof(DateTime)
select p;
foreach (var prop in dateProps)
{
prop.Relational().ColumnType = "datetime2(4)";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2452 次 |
| 最近记录: |