如何解决EF:带有 Context.Set<X> 的通用存储库导致“实体类型 X 不是当前上下文模型的一部分”
我想创建一个如下所示的通用存储库:Generic Repository Pattern in C#
在展示细节之前,我先描述一下问题:
如果我在 DbSet<X>
类型的 DbContext 中创建一个显式成员,那么一切正常。但是当使用 DbContext 创建通用存储库并使用 Context.Set<X>
时,我在调用 The entity type X is not part of the model for the current context
时收到错误消息 Table.ToList()
。我读过像 this 这样的线程,但 @danludwig 的解决方案不是通用的。我该如何解决这个问题?
详情如下:
模型如下:
[Table("MYSCHEMA.soURCE")]
public class Source : Entity<string>
{
private Source() : base("0") { }
public Source(string id) : base(id)
{ }
[Column("ID")]
public string Id {
get { return base.Id; }
set
{
base.Id = value;
}
}
[Column("DESCRIPTION")]
public string Description { get; set; }
}
这是第一个选项,其中包含模型的显式成员,该选项工作正常:
DbContext
包含类 DbSet
的 Source
:
public partial class SourceContext : DbContext
{
public SourceContext()
: base("name=MainConnectionString")
{
}
public virtual DbSet<DomainLayer.Lookups.source> Source { get; set; }
}
由非通用存储库调用:
class SourceRepository
{
private Context.sourceContext SourceContext { get; }
public SourceRepository(Context.sourceContext sourceContext)
{
SourceContext = sourceContext;
}
public List<DomainLayer.Lookups.source> GetSources()
{
return SourceContext.source.ToList();
}
}
这是导致错误的通用选项:
首先是上下文:
class LookupContext : DbContext
{
public LookupContext()
: base("name=MainConnectionString")
{
}
}
这里是使用 DbContext.Set
方法导致 error 的通用存储库:
class GenericLookupRepository<T> where T : class
{
public Context.LookupContext LookupContext { get; set; } = new LookupContext();
public GenericLookupRepository()
{
}
public IList<T> GetAll()
{
DbSet<Source> Table = LookupContext.Set<Source>();
return Table.ToList(); //!!!!! here we have the error
}
}
通用存储库旨在加载查找表,如来源、输入法、地区、国家...。我创建了一个通用存储库,而不是为每个实体创建存储库。
在这个 thread 中,@ChrisPratt 说对于每个实体,我必须在 DbSet
中添加一个 DbContext
。我的情况是这样吗?为什么有必要这样做,因为泛型类型 T
表示我要加载的表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。