Entity framework 从DbSet继承<;张力>;实体框架代码中的第一个空引用

Entity framework 从DbSet继承<;张力>;实体框架代码中的第一个空引用,entity-framework,inheritance,Entity Framework,Inheritance,我想在每个操作中实现nlog以添加一个元素。 因此,当我执行myContext.Society.Add()时,我想记录一些内容。 我创建一个类DbSetExtension,并修改上下文StockContext以使用DbSetExtension public class DbSetExtension<T> : DbSet<T> where T : class { public override T Add(T entity) { Logger

我想在每个操作中实现nlog以添加一个元素。 因此,当我执行myContext.Society.Add()时,我想记录一些内容。 我创建一个类
DbSetExtension
,并修改上下文
StockContext
以使用
DbSetExtension

public class DbSetExtension<T> : DbSet<T> where T : class
{
    public override T Add(T entity)
    {
        LoggerInit.Current().Trace("Add Done");
        return base.Add(entity);
    }
}
你知道吗, 当做 亚历克斯

[更新] 代码允许添加。 如果我用DbSet替换DbSetExtension,同样的代码也可以工作。 所以我的假设是,当我从DbSet继承时,我遗漏了一些东西

    public bool SetSymbols()
    {            
        CsvTools csvThreat = new CsvTools();
        List<Eoddata> currentEnum =
            csvThreat.ExtractData<Eoddata>(ConfigurationManager.GetString("FilePathQuotes", ""));
        currentEnum.ForEach(
            c =>
                {
                    //LoggerInit.Current().Trace("Add Done");
                    Sc.Society.Add(
                        new Society()
                        {
                            RealName = c.Description,
                            Symbol = String.Format("{0}.PA", c.Symbol),
                            IsFind = !String.IsNullOrEmpty(c.Description)
                        });
                });            
        if (Sc.SaveChanges() > 0)
            return true;
        return false;
    }
public bool SetSymbols()
{            
CsvTools csvThreat=新的CsvTools();
列表当前枚举=
提取数据(ConfigurationManager.GetString(“FilePathQuotes”);
currentEnum.ForEach(
c=>
{
//LoggerInit.Current().Trace(“添加完成”);
Sc.Society.Add(
新社会()
{
RealName=c.描述,
Symbol=String.Format(“{0}.PA”,c.Symbol),
IsFind=!String.IsNullOrEmpty(c.Description)
});
});            
如果(Sc.SaveChanges()>0)
返回true;
返回false;
}

在我看来,你完全走错了方向。DbContext是为了与DbSet而不是DbSetExtension类一起工作。它能够实例化DbSet类型的对象,而不是您自己的类型。这就是为什么会出现这种异常。修复它可能需要对EF内部进行黑客攻击,我担心这个问题对您来说只是一个开始。相反,我建议您使用带有截取器类的EF日志记录的一般方法。在这里,这将在文章的末尾详细解释。一般来说,这种方法对您更有利。为什么?因为DbContext只是与db通信的中间人。在日志中,您通常关心数据库及其数据的情况。如果不调用SaveChanges,则在DbSet上调用Add方法可能根本没有任何效果。相反,查询拦截器只允许您记录与数据库的交互。根据发送给db的查询,您可以区分发生了什么

但如果您坚持您的方法,我建议您使用扩展方法,而不是从DbSet派生:

public static class DbSetExtensions
{
    public static T LoggingAdd<T>(this DbSet<T> dbSet, T entity)
    {
        LoggerInit.Current().Trace("Add Done");
        return dbSet.Add(entity);
    }
}

你能分享这部分代码吗:
myContext.Society.Add.
I添加与操作Add相关的代码?I添加代码以添加操作。您好,mr100,谢谢您的回答。你的建议符合我的需要,所以我实现了“记录和拦截数据库操作”。此外,您关于扩展的示例也是正确的。真的谢谢,我想我走错了路。
public static class DbSetExtensions
{
    public static T LoggingAdd<T>(this DbSet<T> dbSet, T entity)
    {
        LoggerInit.Current().Trace("Add Done");
        return dbSet.Add(entity);
    }
}
context.Stock.LoggingAdd(entity);