2012-10-05 4 views
4

мне очень интересно, если есть чистый способ сделать этоВставка Связанные записи в базу данных с помощью Entity Framework

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 равно нулю - я бы любите, чтобы иметь возможность сделать это таким образом, ВМЕСТО, чтобы сделать несколько 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

@Loren хорошо, простой «публичный виртуальный MyList {get; set;}» часто представлен в примерах, но этот способ работы должен быть предпочтительным, когда вам нужно стимулировать модель (и иметь «списки навигации»). –

0

Я просто мозговой штурм здесь, так что не расстраивайтесь, если это не работает, но я думаю, что вам, возможно, придется явно добавить новый ProductImage объект к объекту db.ProductImages предлежащей связывании это для объекта Product.

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» («список навигации» из модели «Продукт») не инстанцируется ... И трудно добавить элемент в нулевой список;) –

+0

Тогда вы должны получить исключение NullReferenceException, когда вы вызываете db.ProductImages.Add(), правильно? –

+0

Да, правильно - дело об этом, хотя я знаю, что могу сделать это таким образом, я просто старался держать его чище, не делая все db.tablename.adds - знаю, что я имею в виду? спасибо за попытку! Решение Рафаэля сделало трюк – 99823

Смежные вопросы