【问题标题】:Error trying to write to dynamically created object in database尝试写入数据库中动态创建的对象时出错
【发布时间】:2018-04-11 13:55:53
【问题描述】:

我需要将对象写入表,我知道我只会在运行时知道对象将写入哪个表。

为此,我创建了一个字典,其中的键和值定义了表字段的名称及其值。但是,当我尝试在银行中写入此对象时,我收到错误 value cannot be null. r nparameter name entitytype

Dictionary<string, string> myobject = new Dictionary<string, string>();

myobject.Add("id_Lote", idLote.ToString());
myobject.Add("nr_Recuperacao", lote.nr_Recuperacao.ToString());
myobject.Add("id_Cliente", lote.id_Cliente);
myobject.Add("id_Produto", lote.id_Produto);

foreach (var item in loteDto.ItensCapaLote)
{
    myobject.Add(item.id_ItemCapaLote.Replace(" ",""), item.valor);
}

public void NovoTipoCapaLote(dynamic myobject, string nameTable)
{
    db.Set(nameTable).Add(myobject);
    db.SaveChanges();
}

【问题讨论】:

    标签: c# sql .net entity-framework


    【解决方案1】:

    我不确定您是否可以使用字典实现此目的。您可以动态添加对象,但根据我的经验,实际对象类型需要与实体框架对象类型相匹配。我相信您首先需要将其反序列化为该类型,如下所示:Mapping object to dictionary and vice versa

    引用类型仍然可以只是对象,以便可以在运行时计算出来,但是一旦有了它,您就可以在实体框架上下文类中创建一个方法,以根据传入的对象添加到表中使用反射,类似这样的东西。我确信这段代码可以简化,但我不经常使用反射,只是希望这能给你一些想法。

        public void Add(Object o)
        {
            var contextProperties = this.GetType().GetProperties();
            contextProperties = contextProperties.Where(s => s.PropertyType.IsGenericType && s.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>)).ToArray<PropertyInfo>();
            PropertyInfo DbSetToUpdate = contextProperties.Where(s => s.PropertyType.GetGenericArguments()[0] == o.GetType()).FirstOrDefault();
            object DbSetInstance = DbSetToUpdate.GetValue(this, null);
            Type DbSetType = DbSetInstance.GetType();
            MethodInfo DbSetMethod = DbSetType.GetMethod("Add");
            DbSetMethod.Invoke(DbSetInstance, new object[] { o });
        }
    

    【讨论】:

    • 问题是我只会在运行时知道对象类型,而我不能像示例中那样将此类型作为参数传递来进行反射,因为我只有类型名称而没有类型。
    • 很公平。我们在我们的环境中做一些非常相似的事情,我们动态地生成类。查找 Activator.CreateInstance。如果您知道示例中显示的表的名称,则可以生成类,然后通过反射从字典值更新属性。然后你有一个可以传递给实体框架的实际对象。我认为唯一的其他选择是生成动态 SQL。不管怎样,祝你好运,先生。
    【解决方案2】:

    您似乎正在尝试在填充所有必需属性之前保存对象。

    我建议在尝试保存对象之前将 entityType 的值设置为有效值。假设没有其他缺失的属性,这应该可以解决您的问题。

    【讨论】:

    • 我检查了所有表字段都在我的动态对象字典中。在我的对象中,Id 的值是数据库中的字符串是 int,这可能是问题吗?
    • 我认为这不会是导致该错误消息的原因,但如果您不纠正它,那么我希望您在修复此错误后立即看到另一个错误. Entity Framework 一次只会给你一个错误消息,它不会一次性告诉你所有的错误,只会告诉你导致它崩溃的第一件事!
    • 我认为问题是我的字典是对象的集合,但它应该是具有属性的单个对象,我该如何进行这种转换?
    • 我明白了。在这种情况下,也许值得改变策略。乔丹的建议(下)看起来很明智,我认为你会更幸运地追求这种推理。他们提供的链接为您提供了将字典转换为正确对象所需的信息,他们的答案应该为您提供坚实的起点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多