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

时间:2015-02-13 19:49:58

标签: entity-framework-5 breeze

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

3 个答案:

答案 0 :(得分:3)

您可以使用仅用于生成元数据的限制性更强的变体对DbContext进行子类化。您可以继续使用基本上下文来实现持久性目的。

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仍然在服务器端类模型上,可以由恶意客户端的saveChanges请求设置。 DocCode在其SaveChanges验证处理中防范该风险。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用仅用于生成元数据的限制性更强的变体对DbContext进行子类化。您可以继续使用基本上下文来实现持久性目的。

DocCode示例使用NorthwindMetadataContext来说明此技术,该技术隐藏了元数据中的UserSessionId属性。

只需要几行代码即可完成。

Web API控制器委托NorthwindRepository,您将看到Metadata属性从NorthwindMetadataContext获取元数据,而其他存储库成员引用EFContextProvider完整的NorthwindContext

非常聪明,嗯?