// Model
public class Location : BaseEntity
{
public Guid UserId { get; set; } // FK
public Guid? HometownCityId { get; set; } // FK
public Guid? CurrentCityId { get; set; } // FK
public NetTopologySuite.Geometries.Point Point { get; set; }
public User User { get; set; } // Navigation Property
public City HometownCity { get; set; } // Navigation Property
public City CurrentCity { get; set; } // Navigation Property
}
// Model Configuration
public class LocationConfiguration : IEntityTypeConfiguration<Location>
{
public void Configure(EntityTypeBuilder<Location> builder)
{
builder.ToTable("locations").HasKey(u => u.Id);
builder.Property(i => i.Id).HasColumnName("id").IsRequired();
builder.Property(i => i.UserId).HasColumnName("user_id").IsRequired(); // FK
builder.Property(i => i.HometownCityId).HasColumnName("hometown_city_id"); // FK
builder.Property(i => i.CurrentCityId).HasColumnName("current_city_id"); // FK
builder.Property(i => i.Point)
.HasColumnType("geography (point)");
builder.Property(i => i.CreatedDate).HasColumnName("created_date").IsRequired();
builder.Property(i => i.UpdatedDate).HasColumnName("updated_date");
builder.Property(i => i.DeletedDate).HasColumnName("deleted_date");
builder.HasQueryFilter(i => !i.DeletedDate.HasValue);
builder.HasOne(i => i.User)
.WithOne(i => i.Location)
.HasForeignKey<Location>(i => i.UserId);
builder.HasOne(i => i.HometownCity)
.WithMany(i => i.HometownLocations)
.HasForeignKey(i => i.HometownCityId);
builder.HasOne(i => i.CurrentCity)
.WithMany(i => i.CurrentLocations)
.HasForeignKey(i => i.CurrentCityId);
}
}
// ModelCreating
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasPostgresExtension("postgis");
modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
}
// AddContext
services.AddDbContext<BaseDbContext>(options =>
{
options.UseNpgsql(configuration.GetConnectionString("Default"),
o => o.UseNetTopologySuite());
});
//Packages
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite" Version="8.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.2">
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite" Version="8.0.2" />
The error that comes when I get migrate:
Unable to create a ‘DbContext’ of type ”. The exception ‘The ‘Point’ property ‘Location.Point’ could not be mapped to the database type ‘geography (point)’ because the database provider does not support mapping ‘Point’ properties to ‘geography (point)’ columns. Consider mapping to a different database type or converting the property value to a type supported by the database using a value converter. See https://aka.ms/efcore-docs-value-converters for more information. Alternately, exclude the property from the model using the ‘[NotMapped]’ attribute or by using ‘EntityTypeBuilder.Ignore’ in ‘OnModelCreating’.’ was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728