gpt4 book ai didi

c# - 使用反射和泛型方法转换泛型实体

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:56 25 4
gpt4 key购买 nike

我有一个名为 RevertChanges 的方法看起来像下面这样:

public static void RevertChanges<TEntity>()
{
var jsonData = DataAccess.GetEnvironmentJson((int)Environments.Production);
var model = JsonConvert.DeserializeObject<Models.FullDataSetModel>(jsonData);
var targetEntity = typeof(TEntity).Name;
using (var db = new LoginPageContentEntities())
{
db.Database.ExecuteSqlCommand(String.Format("TRUNCATE TABLE [{0}]", targetEntity));
var modelValue = model.GetType().GetProperty(targetEntity).GetValue(model, null);
var table = (DbSet)(typeof(LoginPageContentEntities).GetProperty(targetEntity).GetValue(db, null));
table.AddRange((DbSet)modelValue);
db.SaveChanges();
}
}

我知道无论TEntity is 将匹配 modelValue 数据集。 DbSet 转换不起作用,我正在努力寻找如何使用泛型返回整个实体。我发现如果我用 (IEnumerable<TEntity>) 转换我可以调用ToList()在 table 上,但是这不起作用,因为我需要能够调用添加范围。是否可以:

  1. 返回带有泛型的实体引用?
  2. 访问AddRange进而保存上下文?

对于上下文,我正在尝试替换此方法:

public static void RevertChanges(Environments targetToRestoreFrom, ContentFields tableToRevert)
{
var jsonData = DataAccess.GetEnvironmentJson((int)targetToRestoreFrom);
var model = JsonConvert.DeserializeObject<Models.FullDataSetModel>(jsonData);
using (var db = new LoginPageContentEntities())
{
switch (tableToRevert)
{
case ContentFields.ProductInformation:
db.Database.ExecuteSqlCommand("TRUNCATE TABLE [ProductInformation]");
db.ProductInformation.AddRange(model.ProductInformation);
break;
case ContentFields.DidYouKnow:
db.Database.ExecuteSqlCommand("TRUNCATE TABLE [DidYouKnow]");
db.DidYouKnow.AddRange(model.DidYouKnow);
break;
case ContentFields.MaintenanceMessage:
db.Database.ExecuteSqlCommand("TRUNCATE TABLE [MaintenanceMessage]");
db.MaintenanceMessage.AddRange(model.MaintenanceMessage);
break;
case ContentFields.TrainingEvent:
db.Database.ExecuteSqlCommand("TRUNCATE TABLE [TrainingEvents]");
db.TrainingEvents.AddRange(model.TrainingEvents);
break;
case ContentFields.VideoContent:
db.Database.ExecuteSqlCommand("TRUNCATE TABLE [HtmlSnippets]");
db.HtmlSnippets.AddRange(model.HtmlSnippets);
break;
case ContentFields.ProductMarketingUrl:
db.Database.ExecuteSqlCommand("TRUNCATE TABLE [ProductMarketingUrl]");
db.ProductMarketingUrl.AddRange(model.ProductMarketingUrl);
break;
}
db.SaveChanges();
}
}

型号:

namespace LoginPageContentManager.Models
{
public class FullDataSetModel
{
public List<DidYouKnow> DidYouKnow { get; set; }
public List<HtmlSnippets> HtmlSnippets { get; set; }
public List<MaintenanceMessage> MaintenanceMessage { get; set; }
public List<ProductInformation> ProductInformation { get; set; }
public List<TrainingEvents> TrainingEvents { get; set; }
public List<ProductMarketingUrl> ProductMarketingUrl { get; set; }
}
}

最佳答案

Set<T> 方法允许您获得 DbSet一般而言。

在您的情况下,您应该能够通过执行以下操作添加到集合中:

db.Set<TEntity>().AddRange(modelValue)

关于c# - 使用反射和泛型方法转换泛型实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32052879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com