Entity Framework Npgsql 不可能获取外键实体的核心
Entity Framework Core getting Forein Key entities not possible with Npgsql
我在 Entity Framework 核心的 Npgsql 中遇到了一个奇怪的行为:
我的模特:
public class Customer
{
public Customer()
{
Numbers = new List<TelephoneNumber>();
Emails = new List<Email>();
}
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public Address Address { get; set; }
public List<TelephoneNumber> Numbers {get;set;}
public List<Email> Emails { get; set; }
public string Note { get; set; }
}
public class Address
{
public int AddressId { get; set; }
public string Street { get; set; }
public int HouseNumber { get; set; }
public int Code { get; set; }
public string City { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
public class Email
{
public int EmailId { get; set; }
public string Address { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
public class TelephoneNumber
{
public int TelephoneNumberId { get; set; }
public string Number { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
还有我的 DbContext:
public class CustomerContext : DbContext
{
public CustomerContext(DbContextOptions<CustomerContext> options) : base(options)
{}
public DbSet<Customer> Customers {get; set;}
public DbSet<Address> Addresses { get; set; }
public DbSet<Email> Emails {get;set;}
public DbSet<TelephoneNumber> Numbers {get;set;}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Customer>().HasKey(m => m.CustomerId);
builder.Entity<Address>().HasKey(m => m.AddressId);
builder.Entity<Email>().HasKey(m => m.EmailId);
builder.Entity<TelephoneNumber>().HasKey(m => m.TelephoneNumberId);
base.OnModelCreating(builder);
}
}
我已成功连接到 postgresql 数据库,并且使用 "dotnet ef migrations add initPG" 和 "dotnet ef database update" 创建了模式,没有右外键约束等问题。
然后我创建一个客户:
var created = _context.Customers.Add(cust);
_context.SaveChanges();
客户包含地址、电子邮件和电话号码。
我的问题是当我想从数据库中获取所有客户时:
IEnumerable<Customer> customers = _context.Customers.ToList();
我只得到地址、电子邮件和电话号码属性为空的客户!!
我这里有逻辑上的误解吗!?我认为 EF-Framework 会自动执行 table 连接。
还是我需要自己手动从客户那里获取这些单独的元素?
我在多个来源看到 include 关键字来获取外键属性,但我的 IDE 显示 DbContext 没有 include 方法!
如果您想要 include
扩展方法,请键入
using System.Data.Entity;
或者,如果使用 EF 7,按照 rubiktubik
的建议
using Microsoft.EntityFrameworkCore
在文件的顶部
到那时,你应该可以做到
IEnumerable<Customer> customers = _context.Customers
.Include(c => c.Emails)
.ToList();
我在 Entity Framework 核心的 Npgsql 中遇到了一个奇怪的行为:
我的模特:
public class Customer
{
public Customer()
{
Numbers = new List<TelephoneNumber>();
Emails = new List<Email>();
}
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string SecondName { get; set; }
public Address Address { get; set; }
public List<TelephoneNumber> Numbers {get;set;}
public List<Email> Emails { get; set; }
public string Note { get; set; }
}
public class Address
{
public int AddressId { get; set; }
public string Street { get; set; }
public int HouseNumber { get; set; }
public int Code { get; set; }
public string City { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
public class Email
{
public int EmailId { get; set; }
public string Address { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
public class TelephoneNumber
{
public int TelephoneNumberId { get; set; }
public string Number { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
还有我的 DbContext:
public class CustomerContext : DbContext
{
public CustomerContext(DbContextOptions<CustomerContext> options) : base(options)
{}
public DbSet<Customer> Customers {get; set;}
public DbSet<Address> Addresses { get; set; }
public DbSet<Email> Emails {get;set;}
public DbSet<TelephoneNumber> Numbers {get;set;}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Customer>().HasKey(m => m.CustomerId);
builder.Entity<Address>().HasKey(m => m.AddressId);
builder.Entity<Email>().HasKey(m => m.EmailId);
builder.Entity<TelephoneNumber>().HasKey(m => m.TelephoneNumberId);
base.OnModelCreating(builder);
}
}
我已成功连接到 postgresql 数据库,并且使用 "dotnet ef migrations add initPG" 和 "dotnet ef database update" 创建了模式,没有右外键约束等问题。
然后我创建一个客户:
var created = _context.Customers.Add(cust);
_context.SaveChanges();
客户包含地址、电子邮件和电话号码。
我的问题是当我想从数据库中获取所有客户时:
IEnumerable<Customer> customers = _context.Customers.ToList();
我只得到地址、电子邮件和电话号码属性为空的客户!!
我这里有逻辑上的误解吗!?我认为 EF-Framework 会自动执行 table 连接。 还是我需要自己手动从客户那里获取这些单独的元素?
我在多个来源看到 include 关键字来获取外键属性,但我的 IDE 显示 DbContext 没有 include 方法!
如果您想要 include
扩展方法,请键入
using System.Data.Entity;
或者,如果使用 EF 7,按照 rubiktubik
的建议
using Microsoft.EntityFrameworkCore
在文件的顶部
到那时,你应该可以做到
IEnumerable<Customer> customers = _context.Customers
.Include(c => c.Emails)
.ToList();