使用Effort的XML列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Effort的XML列相关的知识,希望对你有一定的参考价值。

我使用Effort框架伪造了我的Entity Framework上下文。我正在使用XML类型的列来存储数据。显然Effort无法处理这个问题。我怎么能绕过这个?欢迎所有建议!

答案

我遇到了同样的问题,我编写了一些代码,通过实体框架模型,并从模型中删除xml列类型。

以下是如何使用它的示例。只需为主代码创建一个新的包装器DbContext类,然后使用它。

   public class EffortDbContext : OriginalContext
    {
        public EffortDbContext(DbConnection connection) : base(connection, false)
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            RemoveXmlColumnTypeFromModelBuilder(modelBuilder);
        }

        /// <summary>
        /// Removes the XML column type from model builder.
        /// </summary>
        /// <remarks>Beware in using this code, here be dragons.  It meddles with the internals of the entity model configuration to strip out the XML column type.</remarks>
        /// <param name="modelBuilder">The model builder.</param>
        private void RemoveXmlColumnTypeFromModelBuilder(DbModelBuilder modelBuilder)
        {
            var _modelConfiguration = modelBuilder.GetType()
                .GetField("_modelConfiguration", BindingFlags.NonPublic | BindingFlags.Instance)
                .GetValue(modelBuilder);

            var _entityConfigurations = (IEnumerable) _modelConfiguration.GetType()
                .GetField("_entityConfigurations", BindingFlags.NonPublic | BindingFlags.Instance)
                .GetValue(_modelConfiguration);

            foreach (object configuration in _entityConfigurations)
            {
                var entityConfigurationDictionaryValue = configuration.GetType().GetProperty("Value").GetValue(configuration);


                var ppc = (IEnumerable) entityConfigurationDictionaryValue.GetType()
                    .GetProperty("PrimitivePropertyConfigurations", BindingFlags.NonPublic | BindingFlags.Instance)
                    .GetValue(entityConfigurationDictionaryValue);
                foreach (var primitivePropertyConfiguration in ppc)
                {
                    var primitivePropertyConfigurationValue = primitivePropertyConfiguration.GetType().GetProperty("Value").GetValue(primitivePropertyConfiguration);
                    var columnTypeProperty = primitivePropertyConfigurationValue.GetType().GetProperty("ColumnType");
                    if (columnTypeProperty.GetValue(primitivePropertyConfigurationValue)?.ToString() == "xml")
                        columnTypeProperty.SetValue(primitivePropertyConfigurationValue, null);
                }
            }
        }
    }

希望这可以帮助。

以上是关于使用Effort的XML列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Effort 和 SQL CE 并行进行单元测试失败

需要示例代码片段帮助

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

SQL基础之XML

有关Best-effort理解的相关资料汇总

xml Eclipse模板(代码片段)检查参数并最终抛出IllegalArgumentException