我对 EF 很陌生,我仍在努力解决这一切——我习惯于构建存储过程并调用它们而不是 LINQ-SQL,所以请耐心等待!
我正在尝试构建一个简单的图像管理器,其他实体可以与之相关。所以像
Entity 1
-has 1-> Image Collection
-has many-> Images
Entity 2
-has 1-> Image Collection
-has many->Images
等等...
目前我正在尝试做图像收集->图像方面的事情,但是在尝试保存现有数据时遇到了一些非常令人沮丧的问题。
在我的模型上,我有我的业务方法来AddImage
收集 ala 上的图像列表
public class ImageCollection : Entity
{
[Required]
public string Title { get; set; }
public virtual ICollection<Image> Images { get; set; }
public void AddImage(Image Image)
{
this.Images.Add(Image);
}
}
...然后服务会更新集合 - 添加新图像时这一切都很好。
问题是在更新信息时。现在我知道,如果我正在关联信息,如果我处于某种循环中,我可以附加到现有的东西上,例如:
// get tag from context
var image = new Image { Id = 1 }
// attach into the entity
_service.Attach<Image>(image);
// attach image to collection
collection.Images.Add(image);
但是,当我已经将图像放入其中时collection.Images
,我怎么能在数据库中提交/保存我的集合而不尝试复制所有内容?我试过贴...
// attach any previously referenced images so they don't get duplicated
foreach (var image in Collection.Images.Where(image => image.Id > 0).ToList())
{
Image i = new Image { Id = image.Id };
(_imageCollectionRepository as GenericRespository<ImageCollection>).Attach<Image>(i);
}
我试过设置它的状态(这是在被调用的内部SetAsUnchangedState<T>(T item){}
)
_context.Entry<T>(item).State = System.Data.EntityState.Unchanged;
但什么都没有,只是错误,An object with the same key already exists in the ObjectStateManager
或者AcceptChanges cannot continue because the object’s key values conflict with another object in the ObjectStateManager.
可能还有其他错误。
编辑 1。
我目前正在采取的步骤 - 如果这有帮助......
控制器接收一个
ImageCollection
实体及其列表,Images
根据此问题顶部的模型。然后将其作为视图模型(CollectionID 和列表)发送到视图该视图显示了这些图像及其属性(只是标题),它是主键。然后发布。然后控制器从服务中获取图像集合,
ImageCollection collection = _imageService.FindCollectionById(model.CollectionID)
并通过业务逻辑将每个图像添加到视图模型中。然后控制器将此 ImageCollection 传递给服务进行更新。这就是我认为这一切都有些错误的地方,因为我的控制器和业务逻辑应该是持久性无知的 - 是的,我知道我目前正在通过控制器中的 ID 获取 ImageCollection!我可能只是将视图模型传递给服务,或者稍后创建一个消息请求。
编辑 2 我现在已经找出了哪里出错了,我最终得到了以下代码,目前它并不漂亮,因为我正在努力解决它。但这一切基本上都是正确的吗?或者有没有更有效的方法来做到这一点?
public void UpdateCollection(ViewModels.ImageCollectionViewModel model)
{
// get collection
ImageCollection collection = FindCollectionById(model.CollectionID);
if (model.Images != null)
{
GenericRespository<Image> temp_repository = new GenericRespository<Image>();
// add images
foreach (Image i in model.Images)
{
if (i.Id > 0)
{
temp_repository.Attach<Image>(i);
temp_repository.Update(image);
}
else
{
collection.Images.Add(i);
}
}
temp_repository.SaveChanges();
}
_imageCollectionRepository.Update(collection);
_imageCollectionRepository.SaveChanges();
}
我哪里错了?:( 谢谢。