gpt4 book ai didi

c# - EntityFramework - 实体代理错误

转载 作者:太空宇宙 更新时间:2023-11-03 15:57:22 25 4
gpt4 key购买 nike

我在一个使用 Entityframework 的系统上工作,现在已经超过 12 个月了,项目一直进展顺利,直到昨天,我现在遇到了一个奇怪的错误,我不知道为什么会发生。我所做的与之前所做的没有什么不同,但是一旦我加载有问题的实体并尝试访问任何子实体,我就会收到以下错误:

The entity wrapper stored in the proxy does not reference the same proxy

谁能阐明这实际上意味着什么以及会导致这种情况的原因是什么?

显示我的代码并没有多大帮助。

这是代码的简化版本:

var quote = new QuoteHelper().GetById(orderId);
var updatedQuotes = new Provider().GetExportQuotes(quote.DeparturePoint.Id,quote.DestinationPoint);

访问 DeparturePoint 和 DestinationPoint 时发生错误,但 Quote 加载正确,并且加载了所有属性。

实体 Quote 看起来有点像这样:

public class Quote : BaseQuote, ICloneable
{
public Guid DeparturePointId { get; set; }
public virtual LocationPoint DeparturePoint{ get; set; }

public Guid DestinationPointId { get; set; }
public virtual LocationPoint DestinationPoint{ get; set; }
}

最佳答案

当我尝试在我的实体上实现 ICloneable 并使用 MemberwiseClone 克隆它时,这也发生在我身上。当我使用自己实例化的实体时效果很好。但是,当我使用它来克隆一个使用 EF 加载的实体时,每当我尝试将它添加到 DbSet(或其他各个部分)时,我都会遇到此错误。

经过一些挖掘,我发现当您克隆一个 EF 加载的实体时,您也在克隆代理类。代理类携带的东西之一是对给定实体的包装器的引用。因为浅拷贝仅复制对包装器的引用,所以您突然拥有两个具有相同包装器实例的实体。

此时,EF 认为您已经为您的实体创建或借用了一个不同的代理类,它认为这是出于恶作剧的目的并阻止了您。

编辑

这是我为解决此问题而创建的一个片段。请注意,这可以很好地仅复制 EF 属性,但并不完美。请注意,如果您还有必须复制的私有(private)字段,则需要对其进行修改,但您明白了。

    /// <summary>
/// Makes a shallow copy of an entity object. This works much like a MemberwiseClone
/// but directly instantiates a new object and copies only properties that work with
/// EF and don't have the NotMappedAttribute.
/// </summary>
/// <typeparam name="TEntity">The entity type.</typeparam>
/// <param name="source">The source entity.</param>
public static TEntity ShallowCopyEntity<TEntity>(TEntity source) where TEntity : class, new()
{

// Get properties from EF that are read/write and not marked witht he NotMappedAttribute
var sourceProperties = typeof(TEntity)
.GetProperties()
.Where(p => p.CanRead && p.CanWrite &&
p.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.NotMappedAttribute), true).Length == 0);
var newObj = new TEntity();

foreach (var property in sourceProperties)
{

// Copy value
property.SetValue(newObj, property.GetValue(source, null), null);

}

return newObj;

}

关于c# - EntityFramework - 实体代理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22979396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com