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;
}