我开始使用Entity Framework。
我的代码是从this example
修改的using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
namespace CodeFirstNewDatabaseSample
{
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
foreach (var post in db.Posts)
{
Console.WriteLine(post.Blog.Name);
}
}
}
}
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
}
它工作正常。但我自己写了另一段代码:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFTest
{
class Program
{
static void Main(string[] args)
{
using (var ctx = new DataBaseContext())
{
foreach (var account in ctx.Accounts)
{
Console.WriteLine(account.User.Name); // NullRef here
}
}
}
}
class User
{
public int UserId { get; set; }
public string Name { get; set; }
public virtual List<Account> Accounts { get; set; }
}
class Account
{
public int AccountId { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
}
class DataBaseContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Account> Accounts { get; set; }
}
}
我的代码结果是NullReferenceException
。
使用MS SQL Server Management Studio,我看到了表的内容:
Accounts
:
+-----------+--------+
| AccountId | UserID |
+-----------+--------+
| 1 | 2 |
| 2 | 2 |
+-----------+--------+
Users
:
+--------+-------+
| UserID | Name |
+--------+-------+
| 1 | Vasya |
| 2 | Petya |
| 3 | Masha |
+--------+-------+
当我在ctx.Entry(account).Reference(p => p.User).Load();
之前添加Console.WriteLine
它开始正常工作,但我想使用延迟加载
两个数据库都是从源代码自动生成的(我称之为Code First)。
有什么区别?我做错了什么?
答案 0 :(得分:1)
更改课程&#39;范围公开,它应该工作。
答案 1 :(得分:0)
您需要急切加载相关实体。
有关如何执行此操作的优秀文章,请参阅http://msdn.microsoft.com/en-us/data/jj574232.aspx。