所以我需要做的是以下几点:
我必须加载一些实体(我不知道哪个实体),总是改变相同的属性并将其写回数据库。
这是我的意思的一个小例子:
public static void DoSomething(Type table)
{
using (var db = new Entities())
{
var temp = db.Database.SqlQuery<table>("SELECT * FROM " + table.Name).ToList();
if (temp.Any())
{
foreach (var obj in temp)
{
((table)obj).SomeProp = 1;
}
db.SaveChanges();
}
}
}
table
代表表格的名称/类型
现在如何加载这种类型的实体,更改一些属性并将其写回数据库,如果我不知道确切的类?
编辑:所有这些类都是由实体框架生成的。
答案 0 :(得分:1)
使用C#的动态功能:
foreach(var obj in temp)
{
((dynamic)obj).SomeProp = 1;
}
如果名称为'SomeProp'的属性不存在,则代码将抛出异常。
答案 1 :(得分:0)
据我所知,你有一些对象A,B,C,D,......都有属性&#34; SomeProp&#34;。
那么,为什么不创建像#34; ISomePropEntity&#34;它具有此属性的setter / getter,并允许具有此属性的所有类实现该接口。
然后你需要改变你的方法来获取一个Type对象的ISomePropEntity insteand。
interface ISomePropEntity
{
theType getSomeProp();
setSomeProp(...);
}
class ImplementationClass : ISomePropEntity
{ ... }
然后:
public static void DoSomething(ISomePropEntity table)
{
using (var db = new LiCPS_Entities())
{
var temp = db.Database.SqlQuery<table>("SELECT * FROM " + table.Name).ToList();
if (temp.Any())
{
foreach (var obj in temp)
{
table.setSomeProp(...);
}
db.SaveChanges();
}
}
}
答案 2 :(得分:0)
您有几种方法可以做到这一点:
1.如果您使用SqlQuery,那么为什么要选择一些内容,更新它并将其保存到数据库而不是更新它?
我对SqlCommand并不熟悉(我想有更好更安全(针对SQLI)的方法)但我想它应该看起来像:
using (var db = new LiCPS_Entities())
{
db.Database.SqlCommand("UPDATE" + table + "SET SomeProp = 1 WHERE Id = 12");
}
2.使用上面建议的界面。
3.使用反射 - 您可以根据其字符串名称更新值。
答案 3 :(得分:0)
仅使用dynamic
不能与Entity Framework
一起使用,context
无法识别对实体的更改。
所以我不得不手动更改实体的EntityState
另外,我必须向class constraint
添加TTable
,因为它不会被识别为引用类型。
这里是整个代码:
public static void DoSomething<TTable>(string table) where TTable : class
{
using (var db = new Entities())
{
var temp = db.Database.SqlQuery<TTable>("SELECT * FROM " + table).ToList();
if (temp.Any())
{
foreach (var obj in temp)
{
((dynamic)obj).SomeProp= 1;
db.Entry(obj).State = EntityState.Modified;
db.SaveChanges();
}
}
}
}
答案 4 :(得分:0)
修改后的@OblTobl代码看起来更适合我:
public static void DoSomething<TTable>() where TTable : class
{
using (var db = new Entities())
{
var temp = db.Database.SqlQuery<TTable>("SELECT SomeProp FROM " + typeof(TTable).Name).ToList();
if (temp.Any())
{
foreach (var obj in temp)
{
((dynamic)obj).SomeProp = 1;
db.Entry(obj).State = EntityState.Modified;
db.SaveChanges();
}
}
}
}