在 Entity Framework 核心建立关系
Setting up a relationship in Entity Framework Core
我正在尝试使用 Fluent API 在 Entity Framework Core 中建立一对多关系,但没有成功。
我有两个名为 Message 和 Source 的对象,定义为
public class Message
{
public int ID { get; set; }
public int FromUserID { get; set; }
public int ToUserID { get; set; }
public int SourceID { get; set; }
public int Priority { get; set; }
public string Subject { get; set; }
public string MessageBody { get; set; }
public DateTime DateTimeCreated { get; set; }
public DateTime? DateTimeDelivered { get; set; }
public Source Source { get; set; }
}
public class Source
{
public int ID { get; set; }
public string Name { get; set; }
public ICollection<Message> Messages { get; set; }
}
一个消息与一个来源相关,一个来源与多个消息相关。
在我的上下文中 class 然后我有以下内容
public DbSet<Message> Messages { get; set; }
public DbSet<Source> Sources { get; set; }
然后定义关系为
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
modelBuilder.Entity<Message>()
.HasOne<Source>(m => m.Source)
.WithMany(s => s.Messages);
}
如果我用下面的方法测试这个
var get = context.Messages.Where(m => m.ID == 1).FirstOrDefault();
我的问题是我得到了消息返回的数据 OK 但对于源我只得到 null。
我查看了与此相关的不同教程和 SOF 问题,但我看不出哪里出错了。
希望有人能对此有所启发。
有几种加载相关数据的方法:
预加载:
means that the related data is loaded from the database as part of the initial query
显式加载:
means that the related data is explicitly loaded from the database at a later time
延迟加载:
means that the related data is transparently loaded from the database when the navigation property is accessed
有关详细信息,请参阅 EF Core docs。
如果我们采用延迟加载方法,您可以使用 UseLazyLoadingProxies() 设置您的选项:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString);
...然后将您的导航属性设为虚拟:
public virtual Source Source { get; set; }
和
public virtual ICollection<Message> Messages { get; set; }
将Include(msg => msg.Source)
添加到查询中,它将强制加载
与消息
var get = context.Messages.Include(msg => msg.Source).Where(m => m.ID == 1).FirstOrDefault();
我正在尝试使用 Fluent API 在 Entity Framework Core 中建立一对多关系,但没有成功。
我有两个名为 Message 和 Source 的对象,定义为
public class Message
{
public int ID { get; set; }
public int FromUserID { get; set; }
public int ToUserID { get; set; }
public int SourceID { get; set; }
public int Priority { get; set; }
public string Subject { get; set; }
public string MessageBody { get; set; }
public DateTime DateTimeCreated { get; set; }
public DateTime? DateTimeDelivered { get; set; }
public Source Source { get; set; }
}
public class Source
{
public int ID { get; set; }
public string Name { get; set; }
public ICollection<Message> Messages { get; set; }
}
一个消息与一个来源相关,一个来源与多个消息相关。
在我的上下文中 class 然后我有以下内容
public DbSet<Message> Messages { get; set; }
public DbSet<Source> Sources { get; set; }
然后定义关系为
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
modelBuilder.Entity<Message>()
.HasOne<Source>(m => m.Source)
.WithMany(s => s.Messages);
}
如果我用下面的方法测试这个
var get = context.Messages.Where(m => m.ID == 1).FirstOrDefault();
我的问题是我得到了消息返回的数据 OK 但对于源我只得到 null。
我查看了与此相关的不同教程和 SOF 问题,但我看不出哪里出错了。
希望有人能对此有所启发。
有几种加载相关数据的方法:
预加载:
means that the related data is loaded from the database as part of the initial query
显式加载:
means that the related data is explicitly loaded from the database at a later time
延迟加载:
means that the related data is transparently loaded from the database when the navigation property is accessed
有关详细信息,请参阅 EF Core docs。
如果我们采用延迟加载方法,您可以使用 UseLazyLoadingProxies() 设置您的选项:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer(myConnectionString);
...然后将您的导航属性设为虚拟:
public virtual Source Source { get; set; }
和
public virtual ICollection<Message> Messages { get; set; }
将Include(msg => msg.Source)
添加到查询中,它将强制加载
与消息
var get = context.Messages.Include(msg => msg.Source).Where(m => m.ID == 1).FirstOrDefault();