代码之家  ›  专栏  ›  技术社区  ›  Sergi Papaseit

无法删除具有complexType属性的实体(实体框架4)

  •  1
  • Sergi Papaseit  · 技术社区  · 14 年前

    这已经让我发疯一个星期了。

    我有一门课看起来像这样:

    public class SuggestionVote
    {
       public virtual int ID { get; set; }
       public virtual Suggestion Suggestion { get; set; }
       public virtual User User { get; set; }
       public virtual VoteTypeWrapper VoteType { get; set; }
       public virtual DateTime DateVoted { get; set; }
    
       // Equality overrides omitted
    }
    

    VoteTypeWrapper 实际上是基于项目的枚举包装器 on how to fake enums in Entity Framework 4 看起来是这样的:

    public class VoteTypeWrapper
    {
            private VoteType _type;
    
            public int Value
            {
                get { return (int)_type; }
                set { _type = (VoteType)value; }
            }
    
            public VoteType EnumValue
            {
                get { return _type; }
                set { _type = value; }
            }
    
            public static implicit operator VoteTypeWrapper(VoteType voteType)
            {
                return new VoteTypeWrapper { EnumValue = voteType };
            }
    
            public static implicit operator VoteType(VoteTypeWrapper voteTypeWrapper)
            {
                return voteTypeWrapper == null ? VoteType.NotVoted : voteTypeWrapper.EnumValue;
            }
    }
    

    VoteType 枚举为:

    public enum VoteType
    {
       Up,
       Down,
       NotVoted
    }
    

    我还定义了 ComplexType 在模型设计器中:

    <ComplexType Name="VoteTypeWrapper" >
       <Property Type="Int32" Name="Value" Nullable="false" />
    </ComplexType>
    

    我正在实现的投票系统的工作方式与StackOverflow的投票系统类似:用户可以上下投票;第二次投票会撤消上一次投票,而朝相反方向投票(即,在上一次投票时向下投票)也会撤消投票。

    现在来解决这个问题。投票一次就像一个魅力,所有的值都正确地保存到数据库中。然而,撤销投票却不起作用。要撤消投票,我基本上将投票标记为撤消删除,然后调用 SaveChanges 在上下文中。 一旦我这样做 InvalidOperationException 出现以下消息:

    The entity of type 'System.Data.Entity.DynamicProxies.SuggestionVote_4A3949F5B95E9A51567509467230FD7CEA0FB7761C3AC9C8C2BBC62BCAA033AF' 
    references the same complex object of type 'Web.Model.VoteTypeWrapper' more than once. 
    Complex objects cannot be referenced multiple times by the same entity.
    

    我就是不明白。有人知道我做错了什么吗?我在谷歌上搜索了一天,但没用。

    3 回复  |  直到 10 年前
        1
  •  0
  •   Sergi Papaseit    14 年前

    好吧,我终于决定解决这个问题,但只是简单地绘制一个 int 属性而不是 ComplexType . 我还添加了一个(非映射的)helper属性,以避免从 int VoteType .

    我仍然很想得到我的问题的答案,所以如果你能帮助它,我会感激它。在我把自己的答案标记为正确之前,我会给它几天时间。

    编辑: 既然我对这件事一无所知,我就把自己的回答说得很好。

        2
  •  0
  •   kkara    13 年前

    我刚刚遇到了同样的问题。我有一个类,它包含一个包含另一个复杂类型的复杂类型。我们称它们为Class1、Complex1和ChildComplex。我的场景如下(我不知道它是否与您的匹配,但错误消息完全相同)。

    我从上下文中检索Class1的一个实例,并对complex1的属性进行更改。然后我调用上下文的savechanges并获得相同的异常:

    The entity of type '<Class1>' references the same complex object of type '<Complex2>' more than once. 
    Complex objects cannot be referenced multiple times by the same entity.
    

    除了克隆complex1实例、替换Class1实例中的克隆版本然后进行更改之外,我没有找到其他合适的解决方案。这样,ef就不会抱怨它是同一个复杂对象。

    这真是一种奇怪的行为。如果我有时间(2038年左右),我会尝试将其隔离并报告给微软,闻起来像个虫子…

        3
  •  0
  •   cjb110    10 年前

    我一直在寻找同样的问题,但我刚刚意识到我误解了错误。它并不抱怨您的实体有两个相同类型的属性,而是抱怨您在两个属性中存储了该类型的“完全”相同的对象。

    在我的例子中,我是在一个表上进行查找以获得复杂的类型,现在我意识到如果查找返回相同的值,它将是相同的对象。

    我通过创建一个复杂类型的新对象并将其值设置为与查找相同的值来解决这个问题。