使用反射和实体

时间:2015-08-14 17:22:33

标签: c# entity-framework reflection

我正在尝试编写一些逻辑,以根据动态表值从数据库中获取实体值。在这篇帖子之后,我已经到了TEntity Entity framework - get entity by name

我不遵循这里所说的内容。以下代码:

public static void PublishTable(string user, ContentFields tableToPublish)
        {
            var jsonData = DataAccess.GetEnvironmentJson((int)Environments.Production);
            var model = JsonConvert.DeserializeObject<Models.FullDataSetModel>(jsonData);
            using (var db = new LoginPageContentEntities())
            {
                var deployEntry = db.Deployment.Find((int)Environments.Production);
                deployEntry.DateUpdated = DateTime.Now;

                var pendingChangesFlag = deployEntry.GetType().GetProperty(tableToPublish.ToString());
                pendingChangesFlag.SetValue(deployEntry, false);

                var publishToModel = model.GetType().GetProperty(tableToPublish.ToString());
                var tableValue = (IEnumerable<????>)typeof(LoginPageContentEntities).GetProperty(tableToPublish.ToString()).GetValue(db, null));
                publishToModel.SetValue(model, tableValue.ToList());

                var json = JsonConvert.SerializeObject(model);
                deployEntry.JsonCache = json;
                db.SaveChanges();
            }
        }

例如,如果我在ProductInformation中传递IEnumerable<ProductInformation>的实体,那么当我更改该特定实体时,这将起作用。

运行到演员表的部分,我不遵循从上下文中获取值所需的操作。他们正在定义TEntity,但在定义中没有任何内容。

2 个答案:

答案 0 :(得分:1)

您的问题似乎是 - 什么是TEntity?

TEntity是通用的。来自评论https://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topic2

中提供的链接

参见代码块

public class Stack<T>
{
   T[] m_Items; 
   public void Push(T item)
   {...}
   public T Pop()
   {...}
}

T指定通用。你可以插件类 - 就像实例化Stack时那样你有ProductInformation。例如 -

var stk = new Stack<ProductInformation>();

答案 1 :(得分:0)

我设法通过其他答案的一些帮助来解决我的问题,但是我发布了我的解决方案,因为它适用于使用EF。

public static void PublishTable<TEntity>()
        {
            var targetEntity = typeof(TEntity).Name;
            var model = JsonConvert.DeserializeObject<Models.FullDataSetModel>(DataAccess.GetEnvironmentJson((int)Environments.Production));
            using (var db = new LoginPageContentEntities())
            {
                var deployEntry = db.Deployment.Find((int)Environments.Production);
                deployEntry.DateUpdated = DateTime.Now;
                deployEntry.GetType().GetProperty(targetEntity).SetValue(deployEntry, false);
                model.GetType().GetProperty(targetEntity).SetValue(model, ((IEnumerable<TEntity>)(typeof(LoginPageContentEntities).GetProperty(targetEntity).GetValue(db, null))).ToList());
                deployEntry.JsonCache = JsonConvert.SerializeObject(model);
                db.SaveChanges();
            }
        }