2012-10-05 112 views
4

我很好奇,如果有一個乾淨的方式來做到這一點插入相關記錄到通過實體框架數據庫

Product product = new Product(); 
product.CreateDateTime = DateTime.Now; 
product.Description = productCreateModel.Product.Description; 
product.ManufacturerId = productCreateModel.Manufacturer; 
product.MetaDescription = productCreateModel.Product.MetaDescription; 
product.MetaTitle = productCreateModel.Product.MetaTitle; 
product.Name = productCreateModel.Product.Name; 
product.Status = ProductStatuses.Active; 
product.URL = productCreateModel.Product.URL; 

if (productCreateModel.ProductImage1.ContentLength > 0) 
    { 
     BinaryReader binaryReader = new BinaryReader(productCreateModel.ProductImage1.InputStream); 
       product.ProductImages.Add(new ProductImage() 
       { 
        CreateDateTime = DateTime.Now, 
        Image = binaryReader.ReadBytes(productCreateModel.ProductImage1.ContentLength), 
        PrimaryImage = true 
       }); 
    } 
db.Products.Add(product); 
db.SaveChanges(); 

我遇到的問題是,product.ProductImages爲空 - 我愛能夠這樣做INSTEAD做多個db.TableName.Add/db.SaveChanges,因爲如果我正確地理解它,EF創建一個事務,以便如果有任何失敗,您將不會幻影產品記錄插入沒有產品圖像 - 如果這是有道理的?

+0

我敢肯定,只需一個'db.SaveChanges()'就可以做到這一點,不管你添加了多少對象或者他們的關係是什麼。 – Bobson

回答

4

更改產品型號?

private IList<ProductImage> productImages_; 
public virtual IList<ProductImage> ProductImages { 
    get { 
    return productImages_ ?? (productImages_= new List<ProductImage>()); 
    } 
    set { productImages_ = value;} 
} 
+0

這個工作完美 - 我不認爲它會工作,因爲我使用Code First,不知道如果.net會理解這一點,並仍然正確地將其與我的數據庫 - 但是這是完美的 - 謝謝 – 99823

+0

@洛倫好吧,簡單的'公共虛擬MyList {get; set;}'經常在示例中給出,但是當您需要實例化模型(並且讓「導航列表」實例化)時,這種做法應該是首選。 –

0

我只是頭腦風暴在這裏,如果這行不通,所以不要生氣,但我想你可能需要在新ProductImage實體明確添加到您鏈接之前設置db.ProductImages實體它到產品實體。

Product product = new Product(); 
product.CreateDateTime = DateTime.Now; 
product.Description = productCreateModel.Product.Description; 
product.ManufacturerId = productCreateModel.Manufacturer; 
product.MetaDescription = productCreateModel.Product.MetaDescription; 
product.MetaTitle = productCreateModel.Product.MetaTitle; 
product.Name = productCreateModel.Product.Name; 
product.Status = ProductStatuses.Active; 
product.URL = productCreateModel.Product.URL; 

db.Products.Add(product); 

if (productCreateModel.ProductImage1.ContentLength > 0) 
    { 
     BinaryReader binaryReader = new BinaryReader(productCreateModel.ProductImage1.InputStream); 

     ProductImage image = new ProductImage() 
     { 
       CreateDateTime = DateTime.Now, 
       Image = binaryReader.ReadBytes(productCreateModel.ProductImage1.ContentLength), 
       PrimaryImage = true 
     } 

     db.ProductImages.Add(image); // Add the image to the ProductImage entity set 
     product.ProductImages.Add(image); // link the image to this Product 
    } 

db.SaveChanges(); // Save all changes 
+0

嗯,問題不存在,只是'product.ProductImages'(模型'Product'中的「導航列表」)沒有實例化......並且很難將項目添加到空列表中;) –

+0

那麼當你調用db.ProductImages.Add()時你必須得到一個NullReferenceException,是否正確? –

+0

是的正確 - 這件事雖然是我知道我可以這樣做我只是想通過不必做所有的db.tablename.adds保持清潔 - 知道我的意思嗎?謝謝你的嘗試!拉斐爾的解決方案取得了訣竅 – 99823

相關問題