gpt4 book ai didi

c# - Entity Framework DbSet 反射

转载 作者:太空狗 更新时间:2023-10-30 01:35:43 24 4
gpt4 key购买 nike

我正在尝试遍历我的 DbContext 中包含具有特定基本类型的实体的所有 DbSet。我的目标是在调用 DbContext 上的 SaveChanges 并设置一些默认参数之前使用此循环。

在 C# 中,我的基类如下所示:-

public abstract class TrackedEntity
{
public string ModifiedBy { get; set; }

public DateTime Modified { get; set; }
}

一个派生类的例子是:-

public class Record : TrackedEntity
{
[Key]
public int ID { get; set; }

public string Name { get; set; }
}

我在我的 DbContext 类中创建了一个自定义 SaveChanges 方法,并且可以为每个包含 TrackedEntity 的 DbSet 获取 ProtertyInfo 列表,但是当我尝试循环遍历每个 DbSet 中的值时,我收到一个错误,因为我无法转换我的派生类的 DbSet(例如 DbSet )到基类的 DbSet(例如 DbSet )。

public class MyContext : DbContext
{
public DbSet<Record> Records { get; set; }

public int SaveChanges(string username)
{
//Set TrackedEnity update columns
foreach (PropertyInfo property in GetDbSetPropertyInfos<TrackedEntity>())
{
foreach (TrackedEntity entity in (DbSet<TrackedEntity>)property.GetValue(this, null)) //fails here due to cast
{
entity.Modified = DateTime.UtcNow;
entity.ModifiedBy = username;
}
}
return base.SaveChanges();
}

//return a list of PropertyInfo for each DbSet with a given type in this context
IEnumerable<PropertyInfo> GetDbSetPropertyInfos<T>() where T : class
{
IEnumerable<PropertyInfo> properties = GetType().GetProperties().Where(p => p.PropertyType.IsGenericType
&& p.PropertyType.Name.StartsWith("DbSet")
&& p.PropertyType.GetGenericArguments().Length > 0
&& p.PropertyType.GetGenericArguments()[0].IsSubclassOf(typeof(T)));

return properties;
}
}

有谁知道我想要实现的目标是否可行?

最佳答案

您应该改用 ChangeTracker。

....
foreach( var entry in context.ChangeTracker.Entries<TrackedEntity>())
{
if(entry.State!=EntityState.Unchanged)
{
TrackedEntity entity = entry.Entity;
entity.Modified = DateTime.UtcNow;
entity.ModifiedBy = username;
}
}
context.SaveChanges();

关于c# - Entity Framework DbSet 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24600754/

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