我想关闭UpdateCheck
所有成员的功能(除了他们的主键)。现在我按照下面的示例作为指导,但是我的表的 MetaDataMembers 仍然设置为Always
.
http://www.the-lazy-coder.com/2013/04/set-updatecheck-to-never.html http://www.the-lazy-coder.com/2013/04/set-updatecheck-to-never.html
上面的代码片段只是让您更改属性,但是它似乎永远不会被拾取,因为我可以在代码运行时调试代码,并且我看到所有属性都被设置,所以我假设属性更改不会更改底层对象。
现在,如果我要改变方法并直接从行类型获取元数据成员,我注意到他们有UpdateCheck
属性,但只是吸气剂。那么有没有办法(如果需要的话通过反射)在设置后覆盖这个属性?即使在查看反编译源之后,它也是一个抽象类,我找不到任何可供参考的实现。
我正在使用 SQLMetal 生成上下文文件,因此没有可用的设计器修补,尽管有些人会说我应该运行一些文本编辑宏来解析和更改属性,但这一切听起来太冗长了should只需能够进入内存中的对象并告诉它忽略之前告诉它的任何内容。
所以!有没有办法覆盖实体中的属性?我尝试在创建对象之后和即将进行更新之前在两个构造函数中的该链接中运行原始代码,但是似乎没有任何更改会坚持或至少传播到重要的地方,并且几乎没有有关如何以编程方式执行此操作的任何材料。
在互联网上搜索后,我发现没有很好的方法来做到这一点,尽管有我最初提到的链接,但它不起作用,因为它适用于部分正确的属性,但在上面的情况下,它们正在处理的属性不在内存中,只是装饰,无论如何,下面的代码似乎可以工作,但不太好:
public static void SetUpdateCheckStatus(this IDataContext dataContext, UpdateCheck updateCheckStatus)
{
var tables = dataContext.Mapping.GetTables();
foreach (var table in tables)
{
var dataMembers = table.RowType.DataMembers;
foreach (var dataMember in dataMembers)
{
if (!dataMember.IsPrimaryKey)
{
var dataMemberType = dataMember.GetType();
if (dataMemberType.Name == "AttributedMetaDataMember")
{
var underlyingAttributeField = dataMember.GetType().GetField("attrColumn", BindingFlags.Instance | BindingFlags.NonPublic);
if (underlyingAttributeField != null)
{
var underlyingAttribute = underlyingAttributeField.GetValue(dataMember) as ColumnAttribute;
if (underlyingAttribute != null)
{ underlyingAttribute.UpdateCheck = updateCheckStatus; }
}
}
else
{
var underlyingField = dataMember.Type.GetField("updateCheck", BindingFlags.Instance | BindingFlags.NonPublic);
if (underlyingField != null)
{ underlyingField.SetValue(dataMember, updateCheckStatus); }
}
}
}
}
}
IDataContext 只是我们出于模拟目的而放置在 DataContext 周围的包装器,因此请随意将其更改为 DataContext。它的编写非常具有防御性,因为这种方式会拉回许多不具有所有所需数据的成员,因此它必须将它们过滤掉,并且只对具有所有所需数据的成员起作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)