XML колонка с использованием Effort
Мой контекст Entity Framework подделан с использованием Effort Framework. Я использую типизированный столбец XML для хранения данных. Очевидно Усилие не может справиться с этим. Как я могу обойти это? Все предложения приветствуются!
1 ответ
Я столкнулся с той же проблемой, и я написал немного кода, который проходит через модель структуры сущностей и удаляет тип столбца 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);
}
}
}
}
Надеюсь это поможет.