7

C#のエンティティフレームワークに問題があります。UserとUserRoleの2つのエンティティがあります。それらは関係によって結合されますユーザー*->1UserRole

関数でこのクエリを使用するときはいつでも:

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

クエリはuserを返しますが、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;
}
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、データベース内のとは関係ありません。

于 2012-07-24T10:19:51.927 に答える
0

最も簡単にこれを行うことができます:

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;

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 に答える