Silverlight 使用nhibernate的ria服务时更新一对多关系时出现问题
我正在开发silverlight应用程序,我正在使用RIA数据服务和nHibernate 目前,我有一个与另一个实体有一对多关系的实体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 {
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似乎仍然没有足够的支持;我们应该经营外资银行,而不是实体银行!真遗憾,我认为微软团队应该听从我们的意见=)