我正在尝试构建一个包含多个列表的对象。对象 - 消息 - 由一个表表示,包含的列表由每个表表示。
问题是,在选择消息时,即使子表中有值,应该引用子表中内容的属性也都为零计数。
我已经简化了数据库,因此我只有一个关联的子表来提供问题的一个很好的例子。
我有什么:
一个名为Messages的表包含以下属性:
一个名为Recipients的表包含以下属性:
这两者之间有一种关联。邮件是父邮件,收件人是子邮件。基数是一对多的。参与的属性是Messages.Id - > Recipients.MessageId。
我的目标是能够保存邮件。每封邮件都应包含一个或多个收件人。当我从Messages表中提取消息时,我希望Recipients属性(从与Recipients表的关联生成)向我返回MessageId等于所提取消息的Id的所有收件人。
所以,我插入数据库:
void SendMessage(string message, uint recipient)
{
var m = new Message { Message = message };
context.Messages.InsertOnSubmit(m);
context.SubmitChanges();
var r = new Recipient { MessageId = m.Id, RecipientId = recipient };
context.Recipients.InsertOnSubmit(r);
context.SubmitChanges();
}
现在,如果我从Messages表中选择消息,我会找到该消息。其收件人属性的Count = 0.不知何故,与收件人的关联不会发生。所以我必须做错事。
然而 - 这真让我困惑 - 如果我从收件人表中选择收件人,我会找到具有正确MessageId和RecipientId的收件人。 ORM框架还生成了一个引用父表的属性,这个工作正常!收件人实体的Message属性实际上引用了作为其父级的Message。
为了能够列出父实体的所有子实体,任何人都可以给我一些我缺少的提示吗?或者还有什么更多的信息可以给我一个答案?
答案 0 :(得分:1)
private void SendMessage(string message, uint recipient)
{
var message = new Message { Message = message };
//no need to explicit the relation with message
var r = new Recipient { RecipientId = recipient };
//add the recipient to message's recipients
message.Recipients.Add(r);
context.Messages.InsertOnSubmit(message);
//only one submit is needed
context.SubmitChanges();
}
正如您自己发现的那样,自动生成的Message
类具有类型为Recipients
的{{1}}属性,基本上是与该消息关联的所有收件人。
如果您将收件人添加到要保存的邮件中,LINQ会在提交更改时自动将其与正确的ID密钥关联。