在我的模式定义中引用了许多HasColumnAnnotation和IndexAnnotation用法

本文关键字:HasColumnAnnotation 许多 IndexAnnotation 用法 引用 我的 模式 定义 | 更新日期: 2023-09-27 18:26:02

我有很多代码块,看起来如下:

modelBuilder
    .Entity<Foo>()
    .Property(t => t.X)
    .IsRequired()
    .HasMaxLength(60)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_X_Y", 1) { IsUnique = true }));
modelBuilder
    .Entity<Foo>()
    .Property(t => t.Y)
    .IsRequired()
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_X_Y", 2) { IsUnique = true }));

这个块通过fluent API告诉EF在表Foo上创建一个列XY在一起的唯一索引。

另一个类似的代码块是这样的,表Bar:上有列RS

modelBuilder
    .Entity<Bar>()
    .Property(t => t.R)
    .IsRequired()
    .HasMaxLength(60)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_R_S", 1) { IsUnique = true }));
modelBuilder
    .Entity<Bar>()
    .Property(t => t.S)
    .IsRequired()
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_R_S", 2) { IsUnique = true }));

我想重构它,这样它最终看起来像:

CreateCompositeUnique<Foo>(modelBuilder, "IX_X_Y", t => new {t.X, t.Y});
CreateCompositeUnique<Bar>(modelBuilder, "IX_R_S", t => new {t.R, t.S});

我在想这样的事情:

private void CreateCompositeUnique<T>(DbModelBuilder modelBuilder, string indexName, List<Expression<Func<T, byte[]>>> properties)
{ 
    for (int i = 0; i < properties.Count; i++)
    {
        modelBuilder
        .Entity<typeof(T)>()
        .Property(properties[i])
        .IsRequired() 
        .HasMaxLength(60)  // --only when propery is string
        .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute(indexName, i) { IsUnique = true }));
    }
}

但我有一些问题:

  1. 这是个好主意吗
  2. 如何知道属性是否为字符串
  3. 传递参数的最佳方式是什么
  4. 如何访问"T"?我在.Entity<typeof(T)>遇到编译错误

在我的模式定义中引用了许多HasColumnAnnotation和IndexAnnotation用法

根据Gert Arnold的建议,我创建了一个扩展方法。实际上,它们是两种扩展方法(为什么?自动解释,见代码注释)
public static class ExtensionMethods
{
    public static StringPropertyConfiguration HasIndex(this StringPropertyConfiguration config, string indexName, int i)
    {
        return config.HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation((new IndexAttribute(indexName, i) { IsUnique = true })));
    }
    public static PrimitivePropertyConfiguration HasIndex(this PrimitivePropertyConfiguration config, string indexName, int i)
    {
        return config.HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation((new IndexAttribute(indexName, i) { IsUnique = true })));
    }
}

用法如下:

modelBuilder
    .Entity<Foo>()
    .Property(t => t.X)
    .IsRequired()
    .HasMaxLength(60)
    .HasIndex("IX_X_Y", 1); // <-- here (X is string)
modelBuilder
    .Entity<Foo>()
    .Property(t => t.Y)
    .IsRequired()
    .HasIndex("IX_X_Y", 2); // <-- and here (Y is a primitive)
相关文章:
  • 没有找到相关文章