【问题标题】:POCO class not being transformed into proxyPOCO 类未转换为代理
【发布时间】: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


【解决方案1】:

为什么在这种情况下需要实体框架来创建代理?我猜你没有,因为你没有在电话类中使用延迟加载。您没有列出任何虚拟属性。在 EmployeeProfile 类中,您可以这样做。

请注意,EF 不会为存在的类型创建代理 代理无事可做。这意味着您还可以避免 通过具有密封和/或没有虚拟的类型的代理 属性。

https://msdn.microsoft.com/en-us/data/jj592886.aspx

【讨论】:

  • 我明白了。我没有意识到这一点。我认为代理创建是所有实体类的默认设置。无论如何,感谢您向我指出这一点,我想我需要调整我的代码。
猜你喜欢
  • 2012-07-06
  • 2011-12-31
  • 1970-01-01
  • 2015-06-12
  • 2012-04-10
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多