C# 如何检查EntityEntry是否派生自BaseEntity<;TKey>;在C中#
我有一个C# 如何检查EntityEntry是否派生自BaseEntity<;TKey>;在C中#,c#,C#,我有一个BaseEntity,具有所有实体的通用审计属性 基本实体: 公共类基本实体 { 公钥Id{get;protected set;} public bool Active{get;protected set;} public DateTimeOffset CreatedAt{get;protected set;} 由{get;protected set;}创建的公共字符串 public DateTimeOffset?ModifiedAt{get;protected set;} 公共字符串由
BaseEntity
,具有所有实体的通用审计属性
基本实体
:
公共类基本实体
{
公钥Id{get;protected set;}
public bool Active{get;protected set;}
public DateTimeOffset CreatedAt{get;protected set;}
由{get;protected set;}创建的公共字符串
public DateTimeOffset?ModifiedAt{get;protected set;}
公共字符串由{get;protected set;}修改
}
例如,具有不同键的派生实体
衍生实体:
公共类书:BaseEntity
{
公共字符串名称{get;set;}
}
公共类作者:BaseEntity
{
公共字符串名称{get;set;}
}
公共类图书作者
{
公共int AuthorId{get;set;}
公共作者{get;set;}
公共Guid BookId{get;set;}
公共图书{get;set;}
}
我正在尝试在我的EF CoresaveChangesSync()
中添加创建/更新的用户和时间戳详细信息。但我没办法做到这一点
重写了saveChangesSync()
:
public override Task savechangesync(bool acceptAllChangesOnSuccess,CancellationToken CancellationToken=default)
{
ChangeTracker.DetectChanges();
var timestamp=DateTimeOffset.Now;
var user=“用户名”;
var entityEntries=ChangeTracker
.条目()
其中(e=>e.Entity是BaseEntity
&&(e.State.Equals(EntityState.Added)| | e.State.Equals(EntityState.Modified))
&&!e.Metadata.IsOwned());
foreach(entityEntries中的var条目)
{
entry.Property(“ModifiedAt”).CurrentValue=时间戳;
entry.Property(“ModifiedBy”).CurrentValue=用户;
if(entry.State.Equals(EntityState.Added))
{
entry.Property(“CreatedAt”).CurrentValue=时间戳;
entry.Property(“CreatedBy”).CurrentValue=user;
entry.Property(“Active”).CurrentValue=true;
}
}
return base.saveChangesSync(acceptAllChangesOnSuccess,cancellationToken);
}
如何在我的
LINQ
查询中检查e.Entity是否为BaseEntity
?如果我移除条件并运行;然后,BookAuthor
将抛出异常,因为它们没有审核属性。请协助需要澄清的是,基类并不像您描述的那样“常见”
如果您有两个派生类
public class Book : BaseEntity<int>
public class Author : BaseEntity<Guid>
您愿意使用反射吗?但是它会很昂贵吗?比使用
is
操作符进行简单的类型检查更昂贵。使用反射时,以下情况成立:typeof(BaseEntity)==typeof(Book)。BaseType.GetGenericTypeDefinition()
。感谢您的详细解释和指导。赢得尊重。
public class BaseEntity
{
public bool Active { get; protected set; }
public DateTimeOffset CreatedAt { get; protected set; }
public string CreatedBy { get; protected set; }
public DateTimeOffset? ModifiedAt { get; protected set; }
public string ModifiedBy { get; protected set; }
}
public class BaseEntity<TKey> : BaseEntity
{
public TKey Id { get; protected set; }
}
var entityEntries = ChangeTracker
.Entries()
.Where(e => e.Entity is BaseEntity
&& (e.State.Equals(EntityState.Added) ||
e.State.Equals(EntityState.Modified))
&& !e.Metadata.IsOwned());