我的代码有问题,我尝试在两个对象之间保存多对多连接,但由于某种原因它没有被保存。
我们使用代码优先的方法来创建我们的数据库,在我们的数据库中,我们有以下问题所在的实体:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<ProductTag> ProductTags { get; set; }
}
public class ProductTag
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
表 ProductTagProducts 是自动创建的,当然这只是两者之间的连接表。
现在创建产品工作正常。我们可以运行以下命令,它将在 ProductTagProducts 表中创建连接:
Product.ProductTags.Add(productTag);
为了确保数据库中没有重复的任务,我们自己处理保存。productTag 始终包含具有现有 ID 的产品标签。
当我们要编辑相同或其他产品时会出现问题。该产品有现有标签。我们使用以下过程来保存它:
List<ProductTag> productTags = new List<ProductTag>();
string[] splittedTags = productLanguagePost.TagList.Split(',');
foreach (string tag in splittedTags) {
ProductTag productTag = new ProductTag();
productTag.Name = tag;
productTags.Add(productTagRepository.InsertAndOrUse(productTag));
}
我们用逗号分割标签,这就是它从 HTML 元素中接收的方式。然后我们为它定义一个新实体并使用 InsertAndOrUse 来确定标签是否已经存在。如果标签已经存在,则返回相同的实体,但填写了 ID,如果不存在,则将标签添加到数据库中,然后还返回带有 ID 的实体。我们创建一个新列表以确保产品中没有重复的 ID(我已经尝试将其直接添加到产品的现有标签列表中,结果相同)。
product.ProductTags = productTags;
productRepository.InsertOrUpdate(product);
productRepository.Save();
然后我们将列表设置为 ProductTags 并让存储库处理插入或更新,当然会进行更新。以防万一,这是 InsertOrUpdate 函数:
public void InsertOrUpdate(Product product) {
if (product.Id == default(int)) {
context.Products.Add(product);
} else {
context.Entry(product).State = EntityState.Modified;
}
}
save 方法只是调用上下文的 SaveChanges 方法。当我编辑产品并添加另一个标签时,它不会保存新标签。但是,当我在保存函数上设置断点时,我可以看到它们都在那里:
当我打开新添加的标签“Oeh-la-la”时,我什至可以通过它回顾产品:
但是当保存发生时,所有其他值都成功,ProductTagProducts 表中没有建立任何连接。也许这真的很简单,但我现在一无所知。真希望别人能给个亮眼。
提前致谢。
编辑:根据 ProductTag 的 InsertAndOrUse 方法的要求。它调用的 InsertOrUpdate 方法和上面的完全一样。
public ProductTag InsertAndOrUse(ProductTag productTag)
{
ProductTag resultingdProductTag = context.ProductTags.FirstOrDefault(t => t.Name.ToLower() == productTag.Name.ToLower());
if (resultingdProductTag != null)
{
return resultingdProductTag;
}
else
{
this.InsertOrUpdate(productTag);
this.Save();
return productTag;
}
}