2

我正在努力将 BitFactory.Logging 挂接到我的应用程序中。我的一个变化是我将 LogEvent 发布到我的 MySQL 数据库。运行代码优先,EF 4.1。

我编写了一个自定义数据库记录器,如下所示:

public class DBLogger : Logger
{
    protected override bool DoLog(LogEntry aLogEntry)
    {
        _db.Add(aLogEntry);
        _db.SaveChanges();
        return true;
    }
    private static IDbContext _db = new MyDB();
    public static IDbContext db
    {
        get { return _db; }
    }
}

我有以下课程:

public class LEntry
{
    public virtual LogEntry logEntry { get; set; }
}

}

我有以下 IDbContext:

public interface IDbContext
{

    IQueryable<LEntry> LEntries { get; }
    int SaveChanges();
    T Attach<T>(T entity) where T : class;
    T Add<T>(T entity) where T : class;
    T Delete<T>(T entity) where T : class;
}

和以下

public class MyDB : DbContext, IDbContext
{
    public DbSet<LEntry> LEntries { get; set; }

    IQueryable<LEntry> IDbContext.LEntries
    {
        get { return LEntries; }
    }

    int IDbContext.SaveChanges()
    {
        return SaveChanges();
    }

    T IDbContext.Add<T>(T entity) 
    {
        return Set<T>().Add(entity);
    }

    T IDbContext.Delete<T>(T entity) 
    {
        return Set<T>().Remove(entity);            
    }

    T IDbContext.Attach<T>(T entity)
    {                      
        var entry = Entry(entity);
        entry.State = System.Data.EntityState.Modified;
        return entity;
    }
}

当我运行代码时,我收到以下错误:

“System.Data.Edm.EdmEntityType: : EntityType 'LEEntry' 没有定义键。定义此 EntityType 的键。”

如果我将 LEntry 课程更改为

public class LEntry
{
    [Key]
    public virtual int ID { get; set; }
    public virtual LogEntry logEntry { get; set; }
}

}

并运行,我收到以下错误:

“‘LogEntry’类型映射为复杂类型。Set方法、DbSet对象和DbEntityEntry对象只能用于实体类型,不能用于复杂类型。”

如果我将 LEentry 更改为 ComplexType,如下所示:

[ComplexType]
public class LEntry
{
    [Key]
    public virtual int ID { get; set; }
    public virtual LogEntry logEntry { get; set; }
}

然后我收到以下错误:

“类型‘MyDB.Models.LEentry’已经配置为实体类型。它不能重新配置为复杂类型。”

扔在

    T IDbContext.Add<T>(T entity) 
    {
        return Set<T>().Add(entity);
    }

堵塞。

我要做的就是将 DoLog 方法发布到我的 MySQL 数据库中。

我究竟做错了什么?

4

0 回答 0