尝试写入数据库中动态创建的对象时出错

时间:2018-04-11 13:55:54

标签: c# sql .net entity-framework

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

为此,我创建了一个带有键和值的Dictionary,用于定义表的字段名称及其值。但是,当我尝试在银行中写入此对象时,我收到错误 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();
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我不确定你是否可以使用词典实现这一点。您可以动态添加对象,但根据我的经验,实际对象类型需要与实体框架对象类型匹配。我相信您首先需要将其反序列化为该类型,如下所示: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 });
    }