如何阻止重复插入

时间:2012-05-22 17:52:41

标签: entity-framework

我有这段代码:

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

当我写newProduct.Ingredient.Add时,我怎么办才能在Ingredient表中添加新成分?因为当我这样做时,我的食材表会有六个。


IngredientImpl.Insert:

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

    _repository.Insert(ingredient);
}

存储库:

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

    db.SaveChanges();
}

ProductImpl:

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

    _repository.Update(produto);
}

存储库:

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

    SaveChanges();
}

1 个答案:

答案 0 :(得分:1)

看到您之前的一些问题,您似乎正在努力构建数据访问逻辑。显然,您已为IngredientProduct选择了单独的存储库。我假设两者都有自己的背景。

如果你想坚持这种严格的分离(可能是完全理智的),你必须首先使用Ingredient储存库插入成分。之后,您可以将它们附加到产品存储库中的上下文中,将它们添加到newProduct.Ingredients并保存。

请注意,您将有两笔交易。如果您认为配料可以拥有自己的生命,那么可以插入新的配料,而不管随后产品插入失败。