使用实体拆分时更新对象 - 首先是代码

时间:2015-06-01 11:52:35

标签: entity-framework

我有一个名为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);

这将在我的请求中加载二进制数据并保存更改而不会出现任何问题,但重点是我不应该这样做。

2 个答案:

答案 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;变量,但它看起来更清洁。