7

我对 C# 中的实体框架有疑问。我有 2 个实体,用户和用户角色。它们通过关系用户 *-> 1 UserRole 联系在一起

每当我在函数中使用此查询时:

User user = context.User.Where(i => i.id == id).FirstOrDefault();
return user.UserRole.accessLevel;

查询返回用户,但 UserRole 为空。User表有与UserRole的id相关的roleId,调试时roleId的值是正确的,虽然UserRole实体为null。这很奇怪,因为以前从未发生过……

我已经确保我在模型和数据库中的关系是正确的。我已将正确的行添加到数据库中。

编辑:

抱歉,我应该提到我使用自定义可测试数据库控制器:

public class DBController : IUnitOfWork
{
    readonly ObjectContext context;
    const string ConnectionStringName = "MarketPlaceDBEntities";

    public DBController()
    {
        var connectionString =
        ConfigurationManager
            .ConnectionStrings[ConnectionStringName]
            .ConnectionString;
        context = new ObjectContext(connectionString);
    }

    public void Commit()
    {
        context.SaveChanges();
    }

    public IObjectSet<Category> Category
    {
        get { return context.CreateObjectSet<Category>(); }
    }
    public IObjectSet<ItemComment> ItemComment 
    {
        get { return context.CreateObjectSet<ItemComment>(); }
    }
    public IObjectSet<ItemRating> ItemRating 
    {
        get { return context.CreateObjectSet<ItemRating>(); }
    }
    public IObjectSet<Item> Item 
    {
        get { return context.CreateObjectSet<Item>(); }
    }
    public IObjectSet<ItemSale> ItemSale 
    {
        get { return context.CreateObjectSet<ItemSale>(); }
    }
    public IObjectSet<ItemScreenshot> ItemScreenshot 
    {
        get { return context.CreateObjectSet<ItemScreenshot>(); }
    }
    public IObjectSet<UserRole> UserRole 
    {
        get { return context.CreateObjectSet<UserRole>(); }
    }
    public IObjectSet<User> User 
    {
        get { return context.CreateObjectSet<User>(); }
    }
}

我通过它进行操作。也许它与我的概率有关。

interface IUnitOfWork
{
    IObjectSet<Category> Category { get; }
    IObjectSet<ItemComment> ItemComment { get; }
    IObjectSet<ItemRating> ItemRating { get; }
    IObjectSet<Item> Item { get; }
    IObjectSet<ItemSale> ItemSale { get; }
    IObjectSet<ItemScreenshot> ItemScreenshot { get; }
    IObjectSet<UserRole> UserRole { get; }
    IObjectSet<User> User { get; }
    void Commit();
}

我以前有这整件事,但不知道为什么会出错..

编辑2:

解决了!感谢 RicoSuter。

在我的数据库控制器的构造函数中启用延迟加载解决了这个问题。我以为它已经启用了,因为它在数据库模型中设置为true,但是看起来在创建新上下文时,您必须再次手动启用它。

public DBController()
{
    var connectionString =
    ConfigurationManager
        .ConnectionStrings[ConnectionStringName]
        .ConnectionString;
    context = new ObjectContext(connectionString);
    context.ContextOptions.LazyLoadingEnabled = true;
}
4

3 回答 3

7

尝试急切地加载UserRole(加入):

context.User.Include("UserRole").Where(i => i.id == id).FirstOrDefault();

或先启用延迟加载:

context.ContextOptions.LazyLoadingEnabled = true;
context.User.Where(i => i.id == id).FirstOrDefault();

UserRole否则与您的数据库中的 a 没有关系...

于 2012-07-24T10:19:51.927 回答
0

最简单的你可以这样做:

UserRole user = context.User.Where(i => i.id == id).Select(i => i.UserRole);
return user.accessLevel;

编辑:

User假设您已经在和之间建立了关系UserRole

User user = context.User.Where(i => i.id == id).FirstOrDefault();
UserRole role = context.UserRole.Where(i => user.Contains(i.id)).FirstOrDefault();
return role.accessLevel;

User假设你在和之间没有关系UserRole

int roleid = Convert.ToInt32(context.User.Where(i => i.id == id).Select(i => i.roleid));
UserRole role = context.UserRole.Where(i => i.id == roleid).FirstOrDefault();
return role.accessLevel;

另外,如果您有关系但看不到UserRole下面,请User尝试将其添加到您的模型中

public IDisposable User()
{
    YourDataContext context = new YourDataContext();
    Type ct = context.User.GetType();
    return (IDisposable)(ct);
}
于 2012-07-24T10:22:30.677 回答
0

尝试这个

User user = context.User.Where(i => i.id == id).FirstOrDefault(); return user==null?null:user.UserRole.accessLevel;

于 2012-07-24T10:44:23.403 回答