Cómo bloquear inserciones duplicadas

Tengo este codigo:

var newProduct = new Product(); 
newProduct.Name = "product name";
newProduct.Description = "product descvription";

ProductImpl.Insert(newProduct);

var ingredient1 = new Ingredient { Description = "ingredient 1" };
var ingredient2 = new Ingredient { Description = "ingredient 2" };
var ingredient3 = new Ingredient { Description = "ingredient 3" };

IngredientImpl.Insert(ingredient1);
IngredientImpl.Insert(ingredient2);
IngredientImpl.Insert(ingredient3);

newProduct.Ingredients.Add(ingredient1);
newProduct.Ingredients.Add(ingredient2);
newProduct.Ingredients.Add(ingredient3);

ProductImpl.Update(newProduct);

¿Cómo puedo hacer cuando escribo newProduct.Ingredient.Add no agrega un nuevo ingrediente a la tabla de ingredientes? Porque cuando lo haga, mi tabla de ingredientes tendrá seis.


IngredienteImpl.Insertar:

public void Insert(Ingredient ingredient)
{
    Validate(ingredient);

    _repository.Insert(ingredient);
}

repositorio:

public void Insert(Ingredient ingredient)
{
    db.Ingredient.Add(ingredient);

    db.SaveChanges();
}

ProductoImpl:

public void Update(Product produto)
{
    Validate(produto);

    _repository.Update(produto);
}

Repositorio:

public void Update(Product product)
{
    db.Entry(product).State = EntityState.Modified;

    SaveChanges();
}

preguntado el 22 de mayo de 12 a las 18:05

@Jim Así es como inserto ingredientes en la tabla de ingredientes. Mi producto debe tener solo ingredientes que estén en la base de datos. -

¿Qué versión de EF estás usando? -

¿Cuáles son los tipos de IngredientImpl y ProductImpl? -

No estás mostrando la parte más importante de tu código. Muestra lo que sucede en tu Insert y Update métodos. -

@Ladislav Mrnka Acabo de actualizar la pregunta. -

1 Respuestas

Al ver algunas de sus preguntas anteriores, parece que está luchando con la forma de diseñar su lógica de acceso a datos. Aparentemente, ha elegido repositorios separados para Ingredient y Product. Supongo que ambos tienen su propio contexto.

Si desea aferrarse a esta separación estricta (que puede ser perfectamente sensata), primero deberá insertar los ingredientes, utilizando el repositorio de ingredientes. Después de eso, puede adjuntarlos al contexto en el repositorio de productos, agregarlos a newProduct.Ingredients y guarda.

Tenga en cuenta que tendrá dos transacciones. Eso puede estar bien si decide que los ingredientes pueden tener una vida propia y, por lo tanto, se pueden insertar nuevos ingredientes, independientemente de una falla posterior en la inserción del producto.

contestado el 23 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.