动态转换为特定类

时间:2014-07-30 08:13:50

标签: c# entity-framework

所以我需要做的是以下几点:
我必须加载一些实体(我不知道哪个实体),总是改变相同的属性并将其写回数据库。

这是我的意思的一个小例子:

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代表表格的名称/类型 现在如何加载这种类型的实体,更改一些属性并将其写回数据库,如果我不知道确切的类?

编辑:所有这些类都是由实体框架生成的。

5 个答案:

答案 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();
                }
            }
        }
    }