我有一种情况,我希望使用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;
}
答案 0 :(得分:1)
记录可能遇到此问题的其他人的修复内容。
LoadWith
实际上通过查看数据模型类中的外键是否可以为空来确定是否在LINQ-to-SQL创建的SQL中使用INNER JOIN
或OUTER 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; }
然后一切都按预期工作。