2 つのオブジェクト間の多対多接続を保存しようとするコードに問題がありますが、何らかの理由で保存されません。
コードファーストの方法を使用してデータベースを作成しました。データベースには、この問題が発生する次のエンティティがあります。
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 が自動的に作成されますが、これはもちろん、2 つの間の単なる接続テーブルです。
現在、製品の作成は正常に機能しています。以下を実行するだけで、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;
}
}