【发布时间】:2014-12-03 16:32:13
【问题描述】:
我正在使用 Entity Framework 6,我需要更新实体的属性。
我有以下实体:
public class File
{
public Int32 Id { get; set; }
public Byte Data { get; set; }
public DateTime Updated { get; set; }
public virtual Mime Mime { get; set; }
}
public class Mime
{
public Int32 Id { get; set; }
public String Name { get; set; }
public virtual ICollection<File> Files { get; set; }
}
然后我使用了以下内容:
_repository.Update<File>(file, x => x.Data, x => x.Mime, x => x.Updated);
仓库方法如下:
public void Update<T>(T entity,
params Expression<Func<T, Object>>[] properties)
where T : class
{
_context.Set<T>().Attach(entity);
foreach (var property in properties)
{
MemberExpression expression =
property.Body is MemberExpression ?
(MemberExpression)property.Body :
(MemberExpression)(((UnaryExpression)property.Body)
.Operand);
_context.Entry<T>(entity)
.Property(expression.Member.Name).IsModified = true;
}
}
这适用于Data 和更新的属性,但不适用于Mime。我得到了错误:
类型“文件”的属性“Mime”不是原始或复杂属性。 Property 方法只能用于原始或复杂属性。使用引用或集合方法。
是否有可能完成这项工作并将其集成到我的存储库方法中?
【问题讨论】:
-
第一个问题是:你为什么有这种精心设计的
Update方法?为什么不能将其留给 EF 的更改跟踪器以将属性标记为已修改?更大的图景是什么? -
File 实体有一个属性 Data 可能有点大,因为它包含一个文件......所以我想更新一些字段而不将数据加载到内存中。这有意义吗?当我没有与之相关的实体时,这很有效。
-
你应该看看table spliting。
-
是的,我已拆分表...这是文件表,我要更新文件。
标签: c# .net entity-framework