Max*_*ime 8 c# sql-server entity-framework entity-framework-6
我正在尝试了解 Entity Framework 6,但遇到了一个问题,我已经能够在测试项目中重现该问题:
AMovie有 aName和 a Revenue。ARevenue有一个GrossIncome:
public class Movie
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public Revenue Revenue { get; set; }
}
public class Revenue
{
[Key]
public int Id { get; set; }
public double GrossIncome { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 EF6 代码优先在数据库中保存有关电影的一些数据:
public class MovieContext: DbContext
{
public MovieContext(): base("name=testDB") { }
public DbSet<Movie> Movies { get; set; }
public DbSet<Revenue> Revenues { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我首先在数据库中插入一部新电影及其相关收入:
using (var context = new MovieContext())
{
Revenue revenue = new Revenue()
{
GrossIncome = 10
};
Movie movie = new Movie()
{
Name = "foo",
Revenue = revenue
};
context.Movies.Add(movie);
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我可以在 SQL Server 中看到表已创建,并且Movies.Revenue_Id已创建列,并具有与Revenue.Id.
如果我尝试使用 SQL 查询它,它工作正常:
SELECT Movies.Name, Revenues.GrossIncome
FROM Movies
LEFT JOIN Revenues ON Movies.Revenue_Id = Revenues.Id
Run Code Online (Sandbox Code Playgroud)
回报
Name GrossIncome
----------------------
foo 10
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用实体框架来查询数据:
using (var context = new MovieContext())
{
List<Movie> movieList = context.Movies.ToList();
Console.WriteLine("Movie Name: " + movieList[0].Name);
if (movieList[0].Revenue == null)
{
Console.WriteLine("Revenue is null!");
}
else
{
Console.WriteLine(movieList[0].Revenue.GrossIncome);
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
控制台显示:
Movie Name: foo <- It shows that the query works, and that the data in the main table is fetched.
Revenue is null! <- Even though the data in the DB is correct, EF does not read the data from the foreign key.
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:我做错了什么?外键值应该如何读取?
只需包含您要加载的子实体:
using (var context = new MovieContext())
{
List<Movie> movieList = context.Movies
.Include(m => m.Revenue) // ADD THIS INCLUDE
.ToList();
Console.WriteLine("Movie Name: " + movieList[0].Name);
if (movieList[0].Revenue == null)
{
Console.WriteLine("Revenue is null!");
}
else
{
Console.WriteLine(movieList[0].Revenue.GrossIncome);
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
这将加载电影 - 并确保所有对其各自引用的引用也.Revenue已加载。