我有一个名为Document的类,我将其拆分为两个实体,以便分离昂贵的二进制字段:
[Table("Document")]
public class Document
{
[Key]
public int Id { get; set; }
... other fields ...
[Required]
public virtual DocumentBinary DocumentBinary { get; set; }
}
[Table("Document")]
public class DocumentBinary
{
[Key, ForeignKey("Document")]
public int DocumentId { get; set; }
public Document Document { get; set; }
public byte[] DocumentData { get; set; }
}
因此,一切正常,两个实体共享相同的数据库表,DocumentData仅在需要时加载。
但是,在更新Document实体时,我收到一条错误消息,指出' DocumentBinary是必需的' 。
当我从DocumentBinary虚拟属性中删除 [Required] 属性时,出现以下错误:
实体类型'文档'和' DocumentBinary'无法共享表格'文件'因为它们不在同一类型层次结构中,或者没有有效的一对一外键关系,并且它们之间具有匹配的主键。
我显然可以这样做:
var test = document.DocumentBinary;
在更新文档对象之前:
documentRepository.Update(document);
这将在我的请求中加载二进制数据并保存更改而不会出现任何问题,但重点是我不应该这样做。
答案 0 :(得分:2)
这可以使用流畅的API实现。如果您删除数据注释,并在OnModelCreating
添加此内容,则应该可以使用。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Document>().HasRequired(d => d.DocumentBinary).
WithRequiredDependent(db => db.Document);
}
答案 1 :(得分:0)
我设法通过覆盖DocumentRepository中的Update方法来解决它:
public override void Update(Document document)
{
try
{
DataContext.Entry(document.DocumentBinary).State = EntityState.Modified; // added this line
DataContext.Entry(document).State = EntityState.Modified;
}
catch (System.Exception exception)
{
throw new EntityException("Failed to update document");
}
}
我知道它可能与我评估DocumentBinary的方法相同,只需将其分配给&#39; test&#39;变量,但它看起来更清洁。