Silverlight 使用nhibernate的ria服务时更新一对多关系时出现问题

Silverlight 使用nhibernate的ria服务时更新一对多关系时出现问题,silverlight,nhibernate,ria,Silverlight,Nhibernate,Ria,我正在开发silverlight应用程序,我正在使用RIA数据服务和nHibernate 目前,我有一个与另一个实体有一对多关系的实体 public class Employer { [Key] public virtual int Id { get; set; } public virtual string Name { get; set; } } public class Person { [Key] public virtual int Id {

我正在开发silverlight应用程序,我正在使用RIA数据服务和nHibernate

目前,我有一个与另一个实体有一对多关系的实体

public class Employer {
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

public class Person {
    [Key]
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    [Include]
    [Association("PersonCurrentEmployer", "CurrentEmployerId", "Id", IsForeignKey = true)]
    public virtual Employer CurrentEmployer { get; set; }
    public virtual int? CurrentEmployerId { get; set; }
}
属性
CurrentEmployerId
在映射中设置为不插入和不更新

在Silverlight端,我将人员的
CurrentEmployer
属性设置为客户端的现有雇主,并提交更改

personEntity.CurrentEmployer = megaEmployer;
dataContext.SubmitChanges();
在服务器端,个人实体的
CurrentEmployerId
设置为
megaEmployer.Id
,但
CurrentEmployer
null
。因为我使用的是
CurrentEmployer
属性而不是
CurrentEmployerId
来保存关系,所以关系不会更改

是否有办法强制RIA发送带有保存的
CurrentEmployer
对象,或者我必须使用服务器端的
CurrentEmployerId
加载雇主并将其设置为
CurrentEmployer

有没有办法强制RIA发送带有保存的CurrentEmployer对象,或者我必须使用服务器端的CurrentEmployerId来加载雇主并将其设置为CurrentEmployer

我也遇到了这个问题。基本上,您要么使用[Composition]属性(我不推荐),要么从数据库服务器端加载实体。组合会弄乱客户机数据模型,不会考虑所有需要担心的情况。(RIA论坛.silverlight.net中有更多关于合成的内容)

[更新]一旦实现了二级缓存,从数据库中读取支持实体的担忧基本消失,因为它们将从缓存中加载。此外,如果您只需要NHibernate的代理就可以不抱怨,那么请查看Get/Load(永远记不清是哪个)。。它将返回一个NH代理,并从数据库中选择一个列和实体。(如果您尝试访问代理的另一个属性,NH将选择其余属性。您可以在Ayende的博客上找到更多内容)[/UPDATE]


我遇到的最大问题是让NHib实际保存和加载关系。(我也在使用Fluent)。到目前为止,责任方的回应是“哇,你不能这么做。RIA的开发似乎没有考虑到NHib”。。这是一个蹩脚的回答,伊姆霍。他们不是帮我找出如何映射它,而是告诉我,我的实体中有一个外国密钥是错误的(NHib不应该关心我的实体中有我的FK)…

我想分享我为实现这一点所做的工作,因为对这一场景的“官方”支持是。。。让我们说最好的是无益,最坏的是彻头彻尾的粗鲁

顺便说一句,您的想法与我的想法相同:使外键不插入/更新。但是,我也生成了它。总是()。这样,它将始终读回值

此外,我重写了DomainService.Submit()和DomainService.ExecuteChangeSet()。我在Submit中启动了一个NHibernate事务(尽管我还不确定它是否达到了预期的效果)

我不是将我的保存逻辑放在InsertSomeEntity()或UpdateSomeEntity()方法中,而是在ExecuteChangeSet中完成这一切。这是因为NHibernate,它需要在NHibernate中执行操作之前使实体图完全双向并水合。这包括当子项通过RIA服务连接时从数据库或会话加载实体。(我开始编写方法,以获得那些专门方法所需的各种其他图形片段,但我发现在一个方法中完成这一切更容易。此外,我遇到了RIA希望我首先对子对象执行插入/更新的问题,这对于新项是一个问题。)

我想对composition属性做一个评论。我仍然坚持我之前的评论,不建议将其用于标准子实体集合,但是,它非常适合支持NHibernate组件,因为否则RIA将永远不会发回父实例(组合),这是NHibernate正常工作所必需的


我没有在这里提供任何代码,因为我必须做一些繁重的编辑,但如果您想查看,我可以这样做。

您没有在客户端看到当前雇主的原因是您的关联设置不正确

RIA服务不以通常的方式与推荐人打交道,因此在客户端推荐你的雇主是不起作用的。RIA服务使用实体集,并基于关联属性创建“引用”。你的雇主需要一个有关联的财产,如下所示

    public class Employer 
    {
        private Person person;

        [Key]
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual int PersonID { get; set; }

        [Include]
        [Association("PersonCurrentEmployer", "PersonID", "Id", IsForeignKey = false)]
        public virtual Person Person    {
            get
            {
                return this.person;
            }

            set
            {
                this.person = value;
                if (value != null)
                {
                    this.PersonID = value.Id;
                }
            }
        }
    }

是的,我这里也有同样的问题:我想NHibernate似乎仍然没有足够的支持;我们应该经营外资银行,而不是实体银行!真遗憾,我认为微软团队应该听从我们的意见=)