Entity Framework No se puede insertar clave duplicada en el objeto

No puede encontrar solución a mi problema. Lo siento, si he duplicado la Pregunta.

He relación en Entity Framework code first uno a muchos:

[DataContract(IsReference = true)]
public class PricingPlan
{

    public PricingPlan()
    {
        UserProfiles = new List<UserProfile>();
    }

    [Key]
    [DataMember]
    public Guid PricingPlanId { get; set; }

    [DataMember]
    public string Type { get; set; }

    public ICollection<UserProfile> UserProfiles { get; set; }
}

[DataContract(IsReference = true)]
public class UserProfile : IdentityUser
{
    public DateTime JoinedOn { get; set; }
    public DateTime LastVisited { get; set; }
    public string Location { get; set; }

    public Guid PricingPlanId { get; set; }
    public PricingPlan PricingPlan { get; set; }
}

En PricingPlan Tabla tengo 2 filas Free y Pro

Whe registro de usuario, quiero añadir que él plan Gratuito:

    [AllowAnonymous]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        PricingPlan pp = UnitOfwork.PricingPlanRepository.FirstOrDefault(v => v.Type == "Free");

        UserProfile user = new UserProfile
        {
            UserName = model.UserName,
            Email = model.Email,
            EmailConfirmed = false,
            Location = model.Location,
            JoinedOn = DateTime.Now,
            LastVisited = DateTime.Now,
            PricingPlanId = pp.PricingPlanId,
            PricingPlan = pp
        };

        IdentityResult identityResult = await UserManager.CreateAsync(user, model.Password);

Estoy tomando plan existente de Db y agregarlo a userProfile de la propiedad, pero cuando UserManager tratando de crear usuario, me voy a excepción de:

Violación de la restricción PRIMARY KEY ‘PK_dbo.PricingPlans’. No
insertar una clave duplicada en el objeto ‘dbo.PricingPlans’. El duplicado de la llave
valor (a5139db8-64c1-49a2-97ef-55009259dc23).\r\nel declaración ha
ha terminado.»

OnModelCreating tengo este código:

  modelBuilder.Entity<UserProfile>().HasRequired<PricingPlan>(r=>r.PricingPlan).WithMany(c => c.UserProfiles).HasForeignKey(a=>a.PricingPlanId);

¿Cuál es la forma correcta de agregar entidad existente a la nueva entidad de uno a muchos relación en entity framework code first?

  • Usted no necesita la línea: PricingPlan = pp, estás aleady la creación de la relación mediante la adición de PricingPlanId = pp.PricingPlanId
  • Que es totalmente no un EF problema. El problema es que en la base de datos de insertar un duplicado de las llaves. Leyendo el mensaje de error hace que esta claro.
  • Un hecho añadido PricingPlan = pp, porque cuando quiero entrar UserProfile con PricingPlan – es nulo, pero LazyLoading es falso
  • Yo ahora, que no es EF problema, la cuestión es cómo agregar?
  • He objetos existentes en la base de datos, y solo quiero mapa a un nuevo perfil de usuario. Y cuando quiero entrar perfil de usuario, debe ser PricingPlan(no nulo) en la propiedad
  • Usted está diciendo que usted está usando la carga diferida, pero sus propiedades de navegación no son virtuales. Si no estás virtual EF no realizar la carga perezosa en ellos (no será capaz de crear proxies dinámicos).
  • Yo no estoy usando LazyLoading, me puse a false.
  • El problema es que cuando se están creando nuevas UserProfile, entity framework insertar pp(PricingPlan) de nuevo a la base de datos que ha seleccionado antes. es extraño, ¿por qué EF no seleccionada pp. Publicar el código dentro de UnitOfwork.PricingPlanRepository.

1 Kommentar

  1. 4

    Ok, he resuelto el problema.

    He quitado PricingPlan = pp, como markpsmith dijo. Entonces, cuando yo wan para obtener UserProfile con adjunto de la entidad Pricingplan en ella,
    Acabo de hacer Incluyen:

    this.Context.Set<UserProfile>().Include("PricingPlan").

    Pero no se puede entender, ¿por qué no está incluido por defecto,
    cuando LazyLoading is set to false.

    • Por defecto, Entity Framework 4 utiliza la Carga Diferida. Usted puede desactivar con este código: contexto.De configuración.LazyLoadingEnabled = false; una Vez hecho esto, dependiente de colecciones como la de los Comentarios de la propiedad de un Post en nuestro ejemplo será nulo si no están específicamente incluidos.. Desde aquí

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea