有没有办法在调用 EdmxWriter.WriteEdmx 时忽略某些实体属性

Is there a way to ignore some entity properties when calling EdmxWriter.WriteEdmx

我专门使用 breezejs,breeze js 的服务器代码将 dbcontext 转换为可在客户端使用 EdmxWriter.WriteEdmx 的形式。我向许多属性添加了 JsonIgnore 属性,这样它们就不会传递到客户端。但是,从 EdmxWriter.WriteEdmx 生成(并传递到客户端)的元数据仍然具有这些属性。是否有任何其他属性可以添加到我想忽略的那些属性中,以便它们被 EdmxWriter.WriteEdmx 忽略?或者,我是否需要制作一个单独的方法,以免产生任何其他意外的副作用。

如果您在 属性 上使用 [NotMapped] 属性,那么它应该被 EDMX 进程忽略。

您可以将 class 您的 DbContextDbContext 与您仅用于元数据生成的更严格的变体。您可以继续使用您的基本上下文以实现持久性目的。

DocCode 示例通过其 NorthwindMetadataContext 说明了此技术,它从元数据中隐藏了 UserSessionId 属性。

只需多加几行代码即可。

Web API 控制器委托给 NorthwindRepository,您会看到 Metadata 属性 从 NorthwindMetadataContext 获取元数据,而另一个存储库成员引用 EFContextProvider 以获得完整的 NorthwindContext.

很聪明,嗯?

您可以将 class 您的 DbContextDbContext 与您仅用于元数据生成的更严格的变体。您可以继续使用您的基本上下文以实现持久性目的。

DocCode 示例通过其 NorthwindMetadataContext 说明了此技术,它从元数据中隐藏了 UserSessionId 属性。

只需多加几行代码即可。

public class NorthwindMetadataContext : NorthwindContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // Hide from clients
        modelBuilder.Entity<Customer>().Ignore(t => t.CustomerID_OLD);

        // Ignore UserSessionId in metadata (but keep it in base DbContext)
        modelBuilder.Entity<Customer>().Ignore(t => t.UserSessionId);
        modelBuilder.Entity<Employee>().Ignore(t => t.UserSessionId);
        modelBuilder.Entity<Order>().Ignore(t => t.UserSessionId);
        // ... more of the same ...
    }
}

Web API 控制器委托给 NorthwindRepository,您会看到 Metadata 属性 从 NorthwindMetadataContext 获取元数据,而另一个存储库成员引用 EFContextProvider 以获得完整的 NorthwindContext.

public class NorthwindRepository
{
    public NorthwindRepository()
    {
        _contextProvider = new EFContextProvider<NorthwindContext>();
    }

    public string Metadata
    {
        get
        {
            // Returns metadata from a dedicated DbContext that is different from
            // the DbContext used for other operations
            // See NorthwindMetadataContext for more about the scenario behind this.
            var metaContextProvider = new EFContextProvider<NorthwindMetadataContext>();
            return metaContextProvider.Metadata();
        }
    }

    public SaveResult SaveChanges(JObject saveBundle)
    {
        PrepareSaveGuard();
        return _contextProvider.SaveChanges(saveBundle);
    }

    public IQueryable<Category> Categories {
      get { return Context.Categories; }
    }
    // ... more members ...
}

很聪明,嗯?

请记住,UserSessionId 仍在服务器端 class 模型中,并且可以由流氓客户端的 saveChanges 请求设置。 DocCode 在其 SaveChanges 验证处理中防范这种风险。