[英]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;
編輯:
假設您已經擁有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;
此外,如果您有關系,但無法在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.