2012-01-13 22 views
8

He buscado esto en Google y no recibo ninguna respuesta por mi circunstancia particular.La secuencia contiene más de un elemento coincidente - Agregar elemento con Entiity Framework

This shows the exceptions i'm getting.

Im utilizando Entity Framework de una manera sencilla suposedly. Estoy intentando agregar un registro a la tabla ProductProduct. Sin embargo, recibo una excepción que no tiene sentido.

¿Alguna idea de lo que está mal aquí?

MemberProduct Clase:

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; 
     } 
    } 
} 

Seguimiento de la pila:

 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) 
+0

¿Cuál es el seguimiento de la pila ? – SLaks

+0

Vaya, si no publicó la captura de pantalla, no lo habría creído –

+0

¿Puede publicar el código de 'MemberProduct'? – nemesv

Respuesta

8

pude repro su problema. Su MemberProduct tiene dosId propiedades con diferente carcasa:

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

    public int ID { get; set; } 
} 

código EF utiliza primero convenciones durante el mapeo. Una de las convenciones es que trata las propiedades denominadas Id o TypenameId como claves principales (si no usa el atributo Key o mapeo personalizado) y porque hace la comparación de nombre de propiedad insensiblemente, arroja la excepción.

Eliminar una de las propiedades y debería funcionar.

+0

¿Cómo uso el atributo clave? Es necesario tener ID's ya que la propiedad ID se hereda de una interfaz. – gunwin

+0

Puede encontrar ejemplos para Clave, por ejemplo [aquí] (http://stackoverflow.com/questions/5482670/entity-framework-code-first-define-the-key-for-this-entitytype). Pero creo que está haciendo un uso indebido de las propiedades aquí: en lugar de las propiedades privadas, use campos privados: 'private int id {get; conjunto; } 'cambiar a' private int id; 'etc. Y también debería funcionar. – nemesv

+0

O si no planea poner lógica en los accesadores de propiedades, use plain [auto properies] (http://msdn.microsoft.com/en-us/library/bb384054.aspx) y deje que el marco genere los campos privados para ti. – nemesv

1

Sospecho que EF se confunde por las dos propiedades de ID.

Cambie sus propiedades privadas a campos; eso debería arreglarlo.

0

Recibí este error de secuencia al configurar la información de estado de la entidad al inicializar inicialmente. Solo asegúrese de establecer correctamente el estado de los gráficos de objetos. Mi problema era con los datos de siembra (no durante la ejecución real de la aplicación) ... esta es mi respuesta de todos modos si ayuda a alguien si está obteniendo un error de secuencia (como "La secuencia contiene más de un elemento coincidente") al ejecutar la actualización -database para migraciones. Mientras obtiene este error fuera del método de inicialización, creo que su respuesta podría estar en los estados de Entidad para que los gráficos de objetos se establezcan correctamente.

Entity Framework Code First AddOrUpdate method insert Duplicate values

para obtener ayuda con la configuración de gráficos de objetos de entidad correctamente, consulte la siguiente entrada del blog que es el mejor que he encontrado sobre la configuración correctamente el estado del objeto:

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

Cuestiones relacionadas