【发布时间】:2016-06-20 07:59:55
【问题描述】:
我遇到了一个非常奇怪的脱发问题。多年来我一直在使用 EF 和存储库模式,但现在我遇到了这个非常奇怪的错误:我的 Telephone POCO 类没有被转换为代理。每个其他 POCO 类都成为代理但 Telephone。我已经删除并重新创建了该文件、存储库文件等等......我看不出我在这里犯了什么(可能非常愚蠢)错误。这就是我将它添加到上下文中的方式:
public virtual T Add()
{
return DbSet.Add(DbSet.Create());
}
public virtual T Add(T entity)
{
var temp = Add();
PropertyCopy.CopyValues(entity, temp);
return DbSet.Add(temp);
}
DbSet 所在位置:DbContext.Set<T>()
在这里你可以看到区别:
不工作
工作
这是Telephone POCO 类:
https://gist.github.com/eestein/ce6c453e806b1b1c6ed5ac43410f3687
这是EmployeeProfile POCO 类(这个和所有其他类,成为代理):
https://gist.github.com/eestein/5a657ebe1ead739eaac5b00f2043bebe
这就是它们的创建方式:
var mobileTelephone = Context.Add(new Telephone
{
AreaCode = model.ManagerAreaCode.Value,
CountryCode = model.ManagerCountryCode.Value,
Number = int.Parse(model.ManagerPhone),
IsDefault = true,
Type = TelephoneType.Mobile,
IsValidated = LoggedUser?.IsSuperAdmin() ?? false
});
var profile = Context.Add(new EmployeeProfile
{
Rank = EmployeeRank.Administrator
});
感谢您的帮助,因为我几乎没有头发可以拉...
【问题讨论】:
-
这是什么问题?你不应该关心这些类是否是代理。你为什么要运行
DbSet.Create()然后复制属性?为什么不直接添加您传递的实体?以我的经验,代理类仅在您加载行时创建(实际上只是有用),而不是在内存中创建一个。 -
@Rob 嘿伙计,感谢您的评论。问题是我运行了一些前后实体的创建方法。它适用于其他人,而不是这个。它被保存到数据库中,但它绕过了我的 pre 和 post 事件,因为它不是代理。
-
您的前/后方法是如何定义的?依赖于业务逻辑的代理创建似乎是个坏主意。您的
public virtual T Add(T entity)方法似乎很可疑。为什么不直接将其实现为return DbSet.Add(entity);而不是创建一个新对象并将值复制过来? -
@Rob 老实说,我必须撤消并测试它才能验证。大约 4-5 年前,我创建(并且一直在使用)这个库。如果我没记错的话,那是由于现有课程的一些问题,但我必须再次确认。根据您的第一个问题,我需要实体的状态。每当在我的代码中调用
Save()时,我都会根据它们的EntityState运行我的 pre 和 post 方法。谢谢。 -
@Rob 根据迈克尔的链接,我无能为力,因为如果类不“需要”它,EF 不会创建代理。我没有意识到这一点。很奇怪,我以前从未遇到过这个问题。无论如何,我将调整代码以便它可以处理它。感谢您的帮助!
标签: c# entity-framework