簡體   English   中英

實體框架6代碼首先處理陰影屬性

[英]Entity Framework 6 code first handing shadow properties

我知道如何在實體框架核心中處理陰影屬性

我認為在實體框架6中將是相同的。

結果與我的想法不一樣。

基本上我有一個名為的接口:

public interface IAuditable { }

在EF核心中的OnModelCreating函數上做它很漂亮:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
        {
            if (typeof(IAuditable).IsAssignableFrom(entityType.ClrType))
            {
                modelBuilder.Entity(entityType.ClrType).Property(typeof(string), Auditable.CreatedBy).HasMaxLength(50).IsRequired();
                modelBuilder.Entity(entityType.ClrType).Property(typeof(string), Auditable.UpdatedBy).HasMaxLength(50).IsRequired();
                modelBuilder.Entity(entityType.ClrType).Property(typeof(DateTime), Auditable.CreatedOn).IsRequired();
                modelBuilder.Entity(entityType.ClrType).Property(typeof(DateTime), Auditable.UpdatedOn).IsRequired();
            }
        }

但是EF 6沒有modelBuilder.Model屬性,

所以我將[ef核心代碼]轉換為[ef 6]?

不確定shadow屬性是什么意思,但是對於示例場景, DbModelBuilder.Types<T>提供了一個更簡單的DbModelBuilder.Types<T>方法:

開始輕量級約定的配置,該約定適用於模型中繼承或實現泛型參數指定的類型的所有實體和復雜類型。 此方法不會將類型注冊為模型的一部分。

等效的EF6代碼是這樣的:

modelBuilder.Types<IAuditable>().Configure(e =>
{
    e.Property(Auditable.CreatedBy).HasMaxLength(50).IsRequired();
    e.Property(Auditable.UpdatedBy).HasMaxLength(50).IsRequired();
    e.Property(Auditable.CreatedOn).IsRequired();
    e.Property(Auditable.UpdatedOn).IsRequired();
});

我不知道是否有更簡單的方法。 實際上,要檢索所有實體類型,我會掃描上下文以查找DbSet。

此外,如果找不到更好的解決方案,則可以始終創建一個實現IAuditable的基類,並使用屬性對其進行配置。

無論如何,這里我用來掃描上下文的代碼:

public void All()
{

    var properties = typeof (Context).GetProperties().Where(p => IsSubclassOfRawGeneric(typeof(DbSet<>), p.PropertyType));

    foreach (PropertyInfo property in properties)
    {
        Type entityType = property.PropertyType.GetGenericArguments()[0];
        // ...
    }

}


static bool IsSubclassOfRawGeneric(Type generic, Type toCheck)
{
    while (toCheck != null && toCheck != typeof(object))
    {
        var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck;
        if (generic == cur)
        {
            return true;
        }
        toCheck = toCheck.BaseType;
    }
    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM