代码之家  ›  专栏  ›  技术社区  ›  Jeremy Holovacs

在ef core中设置属性约定?

  •  0
  • Jeremy Holovacs  · 技术社区  · 6 年前

    在NHibernate,他们有一个很好的小公约概念,你可以说,如果一个实体有一个 Name 属性,它是一个字符串,可以对其应用特定的DB行为(例如,将其设置为不为空、最大长度x,如果可以确定所有名称都是唯一的,则可能是唯一的)。

    它将是一个小类,您将它添加到实例工厂,然后砰!数据库模型将相应地构建。

    英孚核心是否有类似的机制?我似乎找不到任何和荒谬的数量的流畅配置为每一个实体的每一个财产是相当乏味的。

    1 回复  |  直到 6 年前
        1
  •  2
  •   David Browne - Microsoft    6 年前

    在ef core中,内置约定用于创建初始模型,您可以在onmodelcreating中覆盖或修改该模型。

    您可以简单地迭代实体和属性来覆盖约定。这可以很好地代替来自EF6的定制约定(至少到目前为止),定制约定还没有使它脱离积压。见 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);
        }