'daki bir nesneyi kaydederken veritabanında birçok bağlantıya yeni bağlantı yapılmadı. İki nesnenin arasında çok fazla bağlantı kurmaya çalıştığım kodla ilgili bir sorunum var, ancak bir neden olmasa bile kaydedildi.EF
, veri tabanımızda şu varlıklara sahip bu sorun hakkında Bizim veritabanı oluşturmak için kod ilk yöntem kullanılırolduğunu burada:
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; }
}
elbette sadece bir bağlantı taşımaktadır ProductTagProducts otomatik olarak oluşturulur var masa, iki arasındaki tablo.
Artık ürünler oluşturmak iyi çalışıyor. Biz sadece şu çalıştırabilir ve ProductTagProducts tablosundaki Connnections oluşturur:
Product.ProductTags.Add(productTag);
yinelenen görevler veritabanında emin, bunu kendimiz için tasarruf işlemek yapmak. ProductTag her zaman mevcut bir kimliğe sahip bir ürün etiketi içerir.
Aynı veya başka bir ürünü düzenlemek istediğimizde sorun ortaya çıkıyor. Ürün için mevcut etiketler var. Ve bunu kaydetmek için aşağıdaki işlemi kullanın:
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));
}
Biz o HTML öğesi alındıktan nasıl, virgül ile etiketler bölün. Sonra bunun için yeni bir varlık tanımlamak ve etiketin zaten var olup olmadığını belirlemek için InsertAndOrUse kullanın. Etiket zaten mevcutsa, aynı varlığı döndürür, ancak kimliğin doldurulduğu halde, henüz mevcut değilse, etiketi veritabanına ekler ve ardından kimliğe sahip öğeyi de döndürür. Ürünün kopya kimliğine sahip olmadığından emin olmak için yeni bir liste oluşturuyoruz (ürünün mevcut etiket listesine doğrudan, aynı sonucu ekleyerek denedim).
product.ProductTags = productTags;
productRepository.InsertOrUpdate(product);
productRepository.Save();
Sonra ProductTags listeyi ayarlamak ve depo insert veya güncelleme, tabii ki, bir güncelleme yapılacaktır halledeyim.
public void InsertOrUpdate(Product product) {
if (product.Id == default(int)) {
context.Products.Add(product);
} else {
context.Entry(product).State = EntityState.Modified;
}
}
tasarruf yöntemi sadece bağlam en SaveChanges yöntemini çağırır: Her ihtimale karşı, bu InsertOrUpdate işlevidir. Ürünü düzenlediğimde ve başka bir etiket eklediğimde yeni etiketi kaydetmez. Kurtarmam işlevi bir kesme noktası ayarlamak Ancak, ben her ikisi de orada olduğunu görebilirsiniz:
Ve yeni eklenen etiketi açtığınızda 'Oeh-la-la' Hatta aracılığıyla ürüne dönüp bakabileceğiniz Ancak, diğer tüm değerler ile başarılı olan kayıt gerçekleştiğinde, ProductTagProducts tablosunda hiçbir bağlantı yapılmaz. Belki bu gerçekten basit bir şey, ama şu anda clueless. Umarım bir başkası parlak bir görünüm verebilir.
Şimdiden teşekkürler.
Düzenleme: ProductTag'ın InsertAndOrUse yöntemini istediği gibi. Çağırdığı InsertOrUpdate yöntemi, tam olarak yukarıdakiyle aynıdır.
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;
}
}
Tüm bu eylemler için tek bir bağlam mı kullanıyorsunuz? –
Evet. Tüm kontrolörlerimize bağlamın aynı örneğini uygulamak için Ninject'i kullanıyorum. – Chris