簡體   English   中英

帶有linq的C#Entity Framework返回null引用

[英]C# Entity Framework with linq returns null reference

我在C#中遇到了實體框架的問題。 我有2個實體,User和UserRole。 他們是關系用戶* - > 1 UserRole

每當我在函數中使用此查詢時:

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

查詢返回用戶,但UserRole為null。 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();
}

我以前做過這整件事,但不知道為什么會出錯。

EDIT2:

解決了! 謝謝RicoSuter。

在我的db控制器的構造函數中啟用延遲加載解決了這個問題。 我認為它已經啟用,因為它在數據庫模型中設置為true,但在創建新上下文時,您必須再次手動啟用它。

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

嘗試熱切地加載UserRole (加入):

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

或首先啟用延遲加載:

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

否則與數據庫中的UserRole無關......

最簡單的你可以做到這一點:

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

編輯:

假設您已經擁有UserUserRole之間的關系

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

假設你沒有UserUserRole之間的關系

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;

此外,如果您有關系,但無法在User下看到UserRole不是嘗試將其添加到您的模型

public IDisposable User()
{
    YourDataContext context = new YourDataContext();
    Type ct = context.User.GetType();
    return (IDisposable)(ct);
}

嘗試這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM