我有一个简单的多对多。产品类别。每个都有另一个的虚拟列表。我创建了这样的产品:
product = new Product()
{
AccountId = this.AccountId,
Name = this.ProductName,
Price = this.ProductPrice,
Slug = this.ProductSlug,
Sku = this.ProductSku,
Favorite = true,
Categories = new List<Category>()
{
category
}
};
product.Id = productManager.Save(product);
然后,当我去保存它时,它不会保存很多。我用谷歌搜索并尝试了这个代码的不同变体,但仍然没有:
public new String Save(Product data)
{
try
{
var entity = GetById(data.Id);
if (entity == null)
{
this.Context.Set<Product>().Add(data);
}
else
{
this.Context.Entry(entity).CurrentValues.SetValues(data);
}
data.Id = this.Context.SaveChanges();
var product = Context.Products
.Include("Categories")
.FirstOrDefault(t => t.Id == data.Id);
/**
* Categories
*/
var categories = this.Context.Categories
.Where(t => t.AccountId == data.AccountId);
var productCategories = new List<Category>();
if (data.SelectedCategoryIds != null && data.SelectedCategoryIds.Any())
{
productCategories.AddRange(categories
.Where(category => data.SelectedCategoryIds.Contains(category.Id)));
}
product.Categories.Clear();
product.Categories.AddRange(productCategories);
this.Context.SaveChanges();
return data.Id;
}
catch (Exception ex)
{
Log.Error(ex);
return null;
}
}
我在这里缺少什么?为什么它不能坚持我的多个类别?
答案 0 :(得分:0)
这在技术上并不是一个答案,但是评论的时间太长了,需要说明一下。看起来你正试图抽象一些实体框架的东西,但这是绝对错误的方法。例如,在我的一个项目中,我有一个服务,它从我的应用程序的其余部分抽象出实体框架,这里有一些相关的代码来展示它们之间的区别:
public virtual void Update<TEntity>(TEntity entity)
where TEntity : class
{
context.Set<TEntity>().Attach(entity);
context.Entry(entity).State = EntityState.Modified;
}
public virtual void Save()
{
try
{
context.SaveChanges();
}
catch (DbEntityValidationException ex)
{
var errorMessages = ex.EntityValidationErrors
.SelectMany(x => x.ValidationErrors)
.Select(x => x.ErrorMessage);
var fullErrorMessage = string.Join("; ", errorMessages);
var exceptionMessage = string.Concat(ex.Message, " The validation errors are: ", fullErrorMessage);
throw new DbEntityValidationException(exceptionMessage, ex.EntityValidationErrors);
}
}
在我的应用程序中,这就是发生的一切:
var entity = new Something { ... };
service.Update<Something>(entity);
service.Save();
所以,上面的代码中有相当多的内容,所以让我退一步。首先,我的服务使用泛型方法,因此我可以使用任何实体,而无需编写新方法或服务类。 <TEntity>
内容是使这项工作成功的原因,并不是严格要求的。此外,当我稍后执行Update<Something>
时,我正在使用此通用方法,因此请指定我正在使用的课程,在本例中为Something
。您需要注意的唯一部分是我的Update<>
方法的这两行,我将根据您的具体情况进行修改:
context.Set<Product>().Attach(product);
context.Entry(product).State = EntityState.Modified;
然后,保存更改所需的唯一其他事项(来自我的Save
方法):
context.SaveChanges();
那就是它。如果单凭该代码不足以更新您的实体,那么坦率地说,您做错了什么,并且您需要解开代码并弄清楚它是什么。