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