DataLoadOptions LoadWith在关系为null时阻止对象加载

时间:2013-02-04 20:55:19

标签: c# sql-server linq-to-sql

我有一种情况,我希望使用LINQ-to-SQL来急切地加载从数据库中检索的用户的组织属性(因为我的using此处尝试使该属性稍后失败,因为上下文的连接已关闭)。问题是有时用户没有组织。在这种情况下,FetchUserByName会返回null。不是我想要的。有没有办法让我按照我想要的方式工作,即返回一个用户实例是否有相关的组织?

    private static void EagerLoad(DataContext ctx)
    {
        var loadOpt = new DataLoadOptions();
        loadOpt.LoadWith<User>(u => u.Organization);
        ctx.LoadOptions = loadOpt;
    }

    public User FetchUserByName(string username)
    {
        User user = null;
        using (var ctx = contextManager.GetSingleDataContext())
        {
            EagerLoad(ctx);
            user = ctx.GetTable<User>().SingleOrDefault(u => u.UserName == username && u.IsActive);
        }

        return user;
    }

1 个答案:

答案 0 :(得分:1)

记录可能遇到此问题的其他人的修复内容。

LoadWith实际上通过查看数据模型类中的外键是否可以为空来确定是否在LINQ-to-SQL创建的SQL中使用INNER JOINOUTER LEFT JOIN数据库。如果它可以为空,则使用外连接。

    [Column]
    public int OrganizationId { get; set; } /*** Here is The Problem ***/

    private EntityRef<Organization> _organization;

    [Association(OtherKey = "OrganizationId", Storage = "_organization", ThisKey = "OrganizationId", IsForeignKey = true)]
    public Organization Organization
    {
        get
        {
            return this._organization.Entity;
        }
    }

将一行更改为:

public? int OrganizationId { get; set; }

然后一切都按预期工作。