[英]Set Property Conventions in EF Core?
在NHibernate中,他们有一个简洁的约定概念,你可以说,如果一个实体有一个Name
属性,并且它是一个字符串,你可以对它应用某些db行为(例如,将它设置为非null,max长度x,如果您可以确定所有名称都是唯一的,则可能是唯一的)。
这将是一个小班,你将它添加到你的实例工厂,并且bam! db模型将相应地构建。
EF Core中是否有类似的机制? 我似乎找不到任何东西,每个房产的每个实体的流畅配置数量都非常繁琐。
在EF Core中,内置约定用于创建初始模型,您可以在OnModelCreating中覆盖或修改该模型。
您可以简单地遍历您的实体,属性覆盖约定。 这可以很好地代替EF6的自定义约定(至少到目前为止)自定义约定没有使其脱离积压。 有关状态和一些示例,请参阅https://github.com/aspnet/EntityFrameworkCore/issues/214 。 在OnModelCreating中读取自定义属性以驱动(或覆盖)实体配置也是一种非常常见的模式。
你的榜样如此:
如果实体具有Name属性,并且它是一个字符串,则可以对其应用某些db行为(例如,将其设置为非null,max length 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);
}
或者,如果要强制所有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)";
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.