0

我有 2 个表 Account 和 Address 具有 1:1 的关系;account 里面有addressid。我已经在 dbml 文件中创建了关联。现在我想编写一个查询来为给定的 accountid 选择帐户,结果帐户中也应该包含地址对象。

 using (var context = new SalesLogixDataClassesDataContext())
        {
            var query = context.ACCOUNTs
                .Where(a => a.ACCOUNTID == id)
                .Select(a => new Account {AccountId = id, AccountName = a.ACCOUNT1, Address=a.ADDRESS});

            return query.FirstOrDefault();
        }

但返回对象中的地址为空。那么我必须在查询中做什么才能检索到地址对象。

编辑:对不起,带你去追逐野鹅。我的关联映射错误(Address.AddressId 映射到 Account.AccountId)。我修复了它,现在它工作正常。谢谢大家的帮助。

4

2 回答 2

2

为什么要在选择中创建一个新的 Account 对象,而不是让 LINQ->SQL 为您处理它?如果您让框架选择对象,它应该正确设置属性的 EntityRef 并且关联应该起作用。

using (var context = new SalesLogixDataClassesDataContext())
    {
        var query = context.ACCOUNTs
            .Where(a => a.ACCOUNTID == id);

        return query.FirstOrDefault();
    }

只是一个编辑,如果您选择从生成的名称更改属性名称,您也可以通过 DBML 设计器执行此操作,因此您获得的对象是友好的,但仍通过实际列名保持与表的关系。

在对您的代码进行第二次审查后(抱歉,我误读了实体的设置),我从原始答案中删除了一些无效文本。

下面是一些示例 XML,说明如何使模型对象更友好,而不是在查询中手动翻译它们。

<Table Name="dbo.ACCOUNT" Member="Accounts">
    <Type Name="Account">
      <Column Name="ACCOUNTID" Member="AccountId" Type="System.Int32" DbType="Int NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
      <Column Name="ACCOUNT1" Member="AccountName" Type="System.String" DbType="VarChar(...) NOT NULL" CanBeNull="false" />
      <Association Name="Address_Account" Member="Address" ThisKey="ThisTablesFKIDToAddress" OtherKey="AddressTablePKID" Type="Address" IsForeignKey="true" />
    </Type>
</Table>

您可以通过设计器做到这一点,这会更容易,也可以让您的地址对象更好地使用。

无论如何,我希望这会有所帮助,我不能确定设置实体发生了什么,如果您想发布帐户对象的代码,它可能会有所帮助,但它会给我们一个从这里出发的地方。

当然,如果您要更改建模对象,则选择代码看起来更像这样:

using (var context = new SalesLogixDataClassesDataContext())
{
    return context.Accounts.FirstOrDefault(account => account.AccountId == id);
}
于 2009-03-06T17:26:12.420 回答
0

仔细查看您配置的对象关系,特别是涉及的键。无论想要/需要使用自定义对象,只要关系配置正确并且数据在数据库中,您提供的查询都会为您提供相关地址。

这是一个示例现实生活配置,其中 StateMaster 有一个 CustomerMasters1 属性(正在清理命名:)

替代文字

于 2009-03-06T22:20:10.437 回答