Breeze - 保存对象图时的错误

时间:2014-01-25 07:53:14

标签: breeze

<德尔> 我在这种情况下有错误: 使用NHibernate,GuidComb生成器和最新的微风拉(2eca9bdb90b7c74c42d45202707221f93371bcc1) 场景:创建一个包含其他实体集合的实体。尝试一次性保存所有内容。 结果:错误在id管理中。 Breeze处理实体并构建SaveOrder。保存父实体(`NHContext.cs`第201行)。现在,父节点的id已从Breeze生成的temp guid更改为数据库中使用的真实guid。然后,当Breeze尝试保存子节点时,我得到了外键约束错误,因为子节点中的外键包含temp id而不是真实id。我几乎可以肯定它正在使用微风1.4.6。在NHibernate代码中已经完成了很多重写。 我没有尝试过别人的身份策略,只有GuidComb。 **编辑**:我和Entity Framework 6有相同的问题 `DatabaseGeneratedOption.Identity` 。这与EF的问题不同。我会问另一个问题。 **编辑**:临时指导是一样的。只有当执行保存时,父guid才会改变,而不是孩子。

这是正确的方案:
实体文档继承自Material。 Material具有MaterialSourceLanguage的集合,该集合是多对多的。

public class BaseEntity : IDeletable
{
    public virtual Guid Id { get; set; }

    public virtual int Version { get; set; }

    public virtual bool IsDeleted { get; set; }

    public virtual DateTime CreationDate { get; set; }

    public virtual DateTime? UpdateDate { get; set; }
}

public class Material : BaseEntity
{
    public virtual IList<MaterialSourceLanguage> SourceLanguages { get; set; }

    public Material()
    {
        this.SourceLanguages = new List<MaterialSourceLanguage>();
    }

}

public class Document : Material
{
    public virtual string FileName { get; set; }
}

public class MaterialSourceLanguage : BaseEntity
{
    public virtual Guid? MaterialId { get; set; }

    public virtual Material Material { get; set; }

    public virtual Guid? LanguageId { get; set; }

    public virtual Language Language { get; set; }

    public MaterialSourceLanguage()
    {
    }
}

如果我创建实体Document并向其附加多个MaterialSourceLanguage,则会发生外键错误。为什么? 在我们的例子中,真实实体类型为DocumentAddToGraph中添加的类型) 当Breeze执行FindInSaveMapNHRelationshipFixer.cs)时,它找不到任何类型Material的实体。

我希望有足够的信息?

修改:我在NHRelationshipFixer.cs做了一个解决方法,现在对我们来说已经足够了:

private EntityInfo FindInSaveMap(Type entityType, object entityId)
    {
        var entityIdString = entityId.ToString();
        var entityInfoList = saveMap.Where(p => entityType.IsAssignableFrom(p.Key)).Select(p => p.Value).FirstOrDefault();
        if (entityInfoList != null)
        {
            var meta = session.SessionFactory.GetClassMetadata(entityType);
            foreach (var entityInfo in entityInfoList)
            {
                var entity = entityInfo.Entity;
                var id = meta.GetIdentifier(entity, EntityMode.Poco);
                if (id != null && entityIdString.Equals(id.ToString()))
                    return entityInfo;
            }
        }
        return null;
    }

0 个答案:

没有答案