2010-06-22 66 views
1

这一直使我疯狂了一个星期。无法删除具有ComplexType属性的实体(实体框架4)

我有一个类,看起来像这样:

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 
} 

我也defi斯内德一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. 

我只是不明白这一点。任何人都知道我可能做错了什么?我一直在谷歌的一天,但无济于事

+0

你确定这是它的原因吗?的ComplexType? – Meligy 2010-11-18 04:22:29

+0

有点奇怪,因为我猜我现在有同样的问题。该实体对于枚举也具有复杂类型属性。不想快速跳到结论 – Meligy 2010-11-18 04:23:22

+0

@Mohammed:在我的例子中,复杂类型的'VoteTypeWrapper'是错误信息中提到的属性(见上),所以我认为对我来说这是安全的复杂的类型是原因。另外,只要我删除它一切正常。如果它看起来像一只鸭子,听起来像鸭子......;) – 2010-11-19 14:45:26

回答

0

嗯,我终于决定解决它,但只是映射int财产,而不是ComplexType。我还添加了一个(非映射)辅助属性,以避免必须从intVoteType不断投射。

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

编辑:由于我没有得到任何答案,所以我把自己的答案标记为好。

0

我刚刚遇到同样的问题。我有一个包含复杂类型的类,其中包含另一个复杂类型。我们称他们为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年),我会尝试隔离它并将其报告给MS,味道像臭虫......

0

我刚刚一直在寻找这个相同的问题,但我刚刚意识到我误解了错误。它并不抱怨你的实体有两个相同类型的属性,它抱怨说你在这两个属性中存储了这个类型的“确切”相同的对象。

在我的情况下,我正在一张桌子上查找以获得我的复杂类型,现在我意识到如果查找返回相同的值,它将是同一个对象。

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