当我使用LINQ ORM映射选择对象时,为什么我的子表实体不显示

时间:2011-09-06 06:13:12

标签: database linq orm

我正在尝试构建一个包含多个列表的对象。对象 - 消息 - 由一个表表示,包含的列表由每个表表示。

问题是,在选择消息时,即使子表中有值,应该引用子表中内容的属性也都为零计数。

我已经简化了数据库,因此我只有一个关联的子表来提供问题的一个很好的例子。

我有什么:

  • 一个名为Messages的表包含以下属性:

    • Id - uint - 自动生成 - 主键
    • 消息 - 字符串
  • 一个名为Recipients的表包含以下属性:

    • MessageId - uint - 主键
    • RecipientId - uint - 主键
  • 这两者之间有一种关联。邮件是父邮件,收件人是子邮件。基数是一对多的。参与的属性是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。

为了能够列出父实体的所有子实体,任何人都可以给我一些我缺少的提示吗?或者还有什么更多的信息可以给我一个答案?

1 个答案:

答案 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密钥关联。