我需要将对象写入表,知道我只会知道在运行时将对象写入哪个表。
为此,我创建了一个带有键和值的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();
}
答案 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 });
}