EFCore导航属性没有被映射



我有一个模型Contact的三个导航属性类型的地方,但当我在数据库id填充请求,但导航属性是空的。如果有人知道问题出在哪里,我会很感激的。

这是我的联系人模型:

public class Contact
{
public string Id { get; set; } = Guid.NewGuid().ToString();
public string Name { get; set; }
public string? IdPlaceContinent { get; set; }
public Place PlaceContinent { get; set; }
public string? IdPlaceCountry { get; set; }
public Place PlaceCountry { get; set; }
public string? IdPlaceCity { get; set; }
public Place PlaceCity { get; set; }
}

这是Place模型:

public string Id { get; set; } = Guid.NewGuid().ToString();
[ForeignKey(nameof(ParentPlaceIsContainedIn))]
public string? IdPlaceIsContainedIn { get; set; }
public Place ParentPlaceIsContainedIn { get; set; }
public string Name { get; set; }
public int LevelNo { get; set; }
public ICollection<Contact> ContinentContacts { get; set; } = new HashSet<Contact>();
public ICollection<Contact> CountryContacts { get; set; } = new HashSet<Contact>();
public ICollection<Contact> CityContacts { get; set; } = new HashSet<Contact>();
public ICollection<Place> ChildPlaceIsContainedIn { get; set; } = new HashSet<Place>();

这是我的DbContext:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>().Property(x => x.Name).HasColumnType("nvarchar(100)");
modelBuilder.Entity<Contact>().Property(x => x.Description).HasColumnType("ntext");
modelBuilder.Entity<Contact>().Property(x => x.Phone).HasColumnType("varbinary(100)");
modelBuilder.Entity<Contact>().Property(x => x.eMail).HasColumnType("varchar(100)");
modelBuilder.Entity<Contact>().Property(x => x.Categories).HasColumnType("varchar(100)");
modelBuilder.Entity<Contact>().Property(x => x.Areas).HasColumnType("varchar(100)");
modelBuilder.Entity<Contact>().Property(x => x.Event).HasColumnType("varchar(100)");
modelBuilder.Entity<Contact>().HasOne(x => x.PlaceCity).WithMany(x => x.CityContacts).HasForeignKey(x => x.IdPlaceCity).OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Contact>().HasOne(x => x.PlaceContinent).WithMany(x => x.ContinentContacts).HasForeignKey(x => x.IdPlaceContinent).OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Contact>().HasOne(x => x.PlaceCountry).WithMany(x => x.CountryContacts).HasForeignKey(x => x.IdPlaceCountry).OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Place>().Property(x => x.Name).HasColumnType("nvarchar(50)");
modelBuilder.Entity<Place>().Property(x => x.LevelNo).HasColumnType("tinyint");
modelBuilder.Entity<Place>().HasOne(x => x.ParentPlaceIsContainedIn).WithMany(x => x.ChildPlaceIsContainedIn).OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<Place>().Property(x => x.IdPlaceIsContainedIn).IsRequired(false);
}

EF默认启用延迟加载

因此,在您的情况下,您必须显式地包含相关数据。您可以使用Include,它是:Microsoft.EntityFrameworkCore的一部分。

var contact = await this.
_dbContext.Contacts
.Include(c => c.PlaceContinent)
.Include(c => c.PlaceCountry)
.Include(c => c.PlaceCity)
.FirstOrDefaultAsync(x => x.Id == id);

最新更新