有没有办法在调用 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 您的 DbContext
子DbContext
与您仅用于元数据生成的更严格的变体。您可以继续使用您的基本上下文以实现持久性目的。
DocCode 示例通过其 NorthwindMetadataContext
说明了此技术,它从元数据中隐藏了 UserSessionId
属性。
只需多加几行代码即可。
Web API 控制器委托给 NorthwindRepository
,您会看到 Metadata
属性 从 NorthwindMetadataContext
获取元数据,而另一个存储库成员引用 EFContextProvider
以获得完整的 NorthwindContext
.
很聪明,嗯?
您可以将 class 您的 DbContext
子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
仍在服务器端 class 模型中,并且可以由流氓客户端的 saveChanges
请求设置。 DocCode 在其 SaveChanges
验证处理中防范这种风险。
我专门使用 breezejs,breeze js 的服务器代码将 dbcontext 转换为可在客户端使用 EdmxWriter.WriteEdmx
的形式。我向许多属性添加了 JsonIgnore
属性,这样它们就不会传递到客户端。但是,从 EdmxWriter.WriteEdmx
生成(并传递到客户端)的元数据仍然具有这些属性。是否有任何其他属性可以添加到我想忽略的那些属性中,以便它们被 EdmxWriter.WriteEdmx
忽略?或者,我是否需要制作一个单独的方法,以免产生任何其他意外的副作用。
如果您在 属性 上使用 [NotMapped] 属性,那么它应该被 EDMX 进程忽略。
您可以将 class 您的 DbContext
子DbContext
与您仅用于元数据生成的更严格的变体。您可以继续使用您的基本上下文以实现持久性目的。
DocCode 示例通过其 NorthwindMetadataContext
说明了此技术,它从元数据中隐藏了 UserSessionId
属性。
只需多加几行代码即可。
Web API 控制器委托给 NorthwindRepository
,您会看到 Metadata
属性 从 NorthwindMetadataContext
获取元数据,而另一个存储库成员引用 EFContextProvider
以获得完整的 NorthwindContext
.
很聪明,嗯?
您可以将 class 您的 DbContext
子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
仍在服务器端 class 模型中,并且可以由流氓客户端的 saveChanges
请求设置。 DocCode 在其 SaveChanges
验证处理中防范这种风险。