看,我有这些非常简单的模型Master-Detail:
手是手指大师(手指是手的细节)
所以在客户端:
Hand hand = domainService.Hands[0]; // get some hand, doesn't matter
...
Finger f = new Finger() { f.Id = Guid.NewId() };
f.Hand = hand; // make connection !!
domainService.Fingers.Add(f);
domainService.SubmitChanges(OnSubmitCompleted, null); // error is here
在服务器端:
public void Insert<T>(T obj)
{
try
{
using (ISession session = _factory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.SaveOrUpdate(obj); // NHibernate error: not-null property references a null or transient value
transaction.Commit();
}
}
catch (Exception ex)
{
throw ;
}
}
问题实际上是关于不通过WCF线路发回关联。所以在服务器端,Hand属性为NULL,但它不应该(违规) - 我只想刷新我的finger.Hand属性
它甚至不是作曲 - 我不需要这种限制的原因
这是metaAttribute类:
[MetadataType(typeof(Finger.FingerMetadata))]
public partial class Finger
{
//[Required(AllowEmptyStrings = true)]
//[Exclude]
public virtual Guid HandID { get; set; }
//{
// get { return Hand.Id; }
//}
internal sealed class FingerMetadata
{
[Key]
public Guid Id { get; set; }
[Include]
//[RoundtripOriginal]
//[ExternalReference]
[Association("Finger-Hand", "HandID", "Id")]
//[ConcurrencyCheck]
//[Composition]
public Hand Hand { get; set; }
}
}
[MetadataType(typeof(Hand.HandMetadata))]
public partial class Hand
{
internal sealed class HandMetadata
{
[Key]
public Guid Id { get; set; }
[Include]
//[ExternalReference]
[Association("Hand-Finger", "Id", "HandID")]
//[Composition]
public IList<Finger> Fingers { get; set; }
}
}
我在这里看到同样的问题http://forums.silverlight.net/forums/p/205220/480824.aspx,但没有人知道.. 请帮忙!
谢谢!
答案 0 :(得分:1)
如果您仍在使用RIA服务(而不是数据服务)寻求帮助
我最近在这两项技术上做了很多工作,我提供了一些关于你在上面发布的SL论坛链接的信息:
"One to many association is null on Server side"(forums.silverlight.net)
答案 1 :(得分:1)
你可以做两件事:
将[作文]应用于您的协会
为所有较低的内容制作更新方法 在域服务上重载受保护的覆盖bool PersistChangeSet():
protected override bool PersistChangeSet()
{
Customer changedCustomer;
bool success = true;
foreach (var item in ChangeSet.ChangeSetEntries)
{
if (item.Entity.GetType() == typeof(Customer))
{
changedCustomer = (Customer)item.Entity;
success = changedCustomer.Save();
if (!success)
break;
}
}
return success;
}