【问题标题】:Sequence contains more than one matching element - Adding item with Entiity Framework序列包含多个匹配元素 - 使用实体框架添加项目
【发布时间】:2012-01-13 19:07:03
【问题描述】:

我在谷歌上搜索过,但没有针对我的特殊情况得到任何答案。

我以一种简单的方式使用实体框架。我正在尝试向 Memberproduct 表添加一条记录。但是我遇到了一个没有意义的异常。

有什么想法吗?

会员产品类:

public class MemberProduct :ISaleable
{
    public void ProcessSale()
    {
        throw new NotImplementedException();
    }

    private int id { get; set; }
    private string productName { get; set; }
    private decimal price { get; set; }
    private TaxClass taxClass { get; set; }
    private int quantity { get; set; }
    private Member memberAssociation { get; set; }

    public TaxClass TaxClass
    {
        get
        {
            return this.taxClass;
        }
        set
        {
            this.taxClass = value;
        }
    }
    public int Quantity
    {
        get
        {
            return this.quantity;
        }
        set
        {
            this.quantity = value;
        }
    }
    public string ProductName
    {
        get
        {
            return this.productName;
        }
        set
        {
            this.productName = value;
        }
    }
    public decimal Price
    {
        get
        {
            return this.price;
        }
        set
        {
            this.price = value;
        }
    }
    public Member MemberAssociation
    {
        get
        {
            return this.memberAssociation;
        }
        set
        {
            this.memberAssociation = value;
        }
    }
    public int ID
    {
        get
        {
            return this.id;
        }
        set
        {
            this.id = value;
        }
    }
}

堆栈跟踪:

     at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.ModelConfiguration.Conventions.IdKeyDiscoveryConvention.IdKeyDiscoveryConventionImpl.MatchKeyProperty(EdmEntityType entityType, IEnumerable`1 primitiveProperties)
   at System.Data.Entity.ModelConfiguration.Conventions.KeyDiscoveryConvention.System.Data.Entity.ModelConfiguration.Conventions.IEdmConvention<System.Data.Edm.EdmEntityType>.Apply(EdmEntityType entityType, EdmModel model)
   at System.Data.Entity.ModelConfiguration.Conventions.IdKeyDiscoveryConvention.System.Data.Entity.ModelConfiguration.Conventions.IEdmConvention<System.Data.Edm.EdmEntityType>.Apply(EdmEntityType entityType, EdmModel model)
   at System.Data.Entity.ModelConfiguration.Configuration.ConventionsConfiguration.EdmConventionDispatcher.Dispatch[TEdmDataModelItem](TEdmDataModelItem item)
   at System.Data.Entity.ModelConfiguration.Configuration.ConventionsConfiguration.EdmConventionDispatcher.VisitEdmEntityType(EdmEntityType item)
   at System.Data.Edm.Internal.DataModelItemVisitor.VisitCollection[T](IEnumerable`1 collection, Action`1 visitMethod)
   at System.Data.Edm.Internal.EdmModelVisitor.VisitEntityTypes(EdmNamespace edmNamespace, IEnumerable`1 entityTypes)
   at System.Data.Edm.Internal.EdmModelVisitor.VisitEdmNamespace(EdmNamespace item)
   at System.Data.Entity.ModelConfiguration.Configuration.ConventionsConfiguration.EdmConventionDispatcher.VisitEdmNamespace(EdmNamespace item)
   at System.Data.Edm.Internal.DataModelItemVisitor.VisitCollection[T](IEnumerable`1 collection, Action`1 visitMethod)
   at System.Data.Edm.Internal.EdmModelVisitor.VisitNamespaces(EdmModel model, IEnumerable`1 namespaces)
   at System.Data.Edm.Internal.EdmModelVisitor.VisitEdmModel(EdmModel item)
   at System.Data.Entity.ModelConfiguration.Configuration.ConventionsConfiguration.EdmConventionDispatcher.VisitEdmModel(EdmModel item)
   at System.Data.Entity.ModelConfiguration.Configuration.ConventionsConfiguration.EdmConventionDispatcher.Dispatch()
   at System.Data.Entity.ModelConfiguration.Configuration.ConventionsConfiguration.ApplyModel(EdmModel model)
   at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.Initialize()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at Nautix_EPOS.Controllers.HomeController.Index() in C:\sites\EPOS\Nautix EPOS\Nautix EPOS\Controllers\HomeController.cs:line 19
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)

【问题讨论】:

  • 哇,如果你不发截图,我不会相信你
  • 可以发MemberProduct的代码吗?
  • 我已经添加了堆栈跟踪。数据库实际上尚未创建,因为这是 EF 的代码优先实现。这就是为什么我不理解异常的“多个”元素。这意味着存在重复数据或主键约束被破坏。
  • 您是否重写了 (?) MemberProduct 类的 GetHashCode 方法?该实体的密钥是什么?

标签: c# .net asp.net-mvc-3 entity-framework-4


【解决方案1】:

我可以重现您的问题。您的 MemberProduct两个 Id 属性,大小写不同:

public class MemberProduct
{
    public int Id { get; set; }

    public int ID { get; set; }
}

EF 代码在映射期间首先使用约定。约定之一是它将名为 IdTypenameId 的属性视为主键(如果您不使用 Key 属性或自定义映射),并且因为它不区分大小写地比较属性名称,所以会引发异常.

删除其中一个属性,它应该可以工作。

【讨论】:

  • 如何使用key属性?必须要有 ID,因为 ID 属性是从接口继承的。
  • 您可以找到 Key 的示例,例如 here。但我认为你在这里滥用属性:而不是私有属性使用私有字段:private int id { get; set; } 更改为private int id; 等。它也应该工作。
  • 或者,如果您不打算将逻辑放入属性访问器中,请使用纯 auto properies 并让框架为您生成私有字段。
  • 这应该在下一个版本中修复。
【解决方案2】:

如果它对任何人有用:

我在使用存储过程中的 EF 填充模型时收到此错误。存储过程返回多个列,其中两个具有相同的别名/名称。

【讨论】:

  • 我目前遇到了同样的问题。你是怎么解决的?
【解决方案3】:

我怀疑 EF 被这两个 ID 属性弄糊涂了。

将您的私有属性更改为字段;这应该可以解决它。

【讨论】:

    【解决方案4】:

    在最初播种时错误地设置实体状态信息时出现此序列错误。只要确保您正确设置对象图的状态即可。我的问题是播种数据(不是在实际应用程序运行期间)......无论如何,如果在运行更新时遇到序列错误(如“序列包含多个匹配元素”)对任何人都有帮助,这就是我的答案-database 用于迁移的命令。虽然您在种子方法之外遇到此错误,但我认为您的答案可能在于正确设置对象图的实体状态。

    Entity Framework Code First AddOrUpdate method insert Duplicate values

    要获得正确设置实体对象图的帮助,请参阅以下博客文章,这是我发现的关于正确设置对象状态的最佳文章:

    http://blog.longle.net/2013/05/11/genericizing-the-unit-of-work-pattern-repository-pattern-with-entity-framework-in-mvc/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-26
      • 2017-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多