NpgSql, EF6, NTS: EntityType 'Point' не определен ключ - PullRequest
0 голосов
/ 03 октября 2018

Я работаю над простым инструментом импорта, написанным на C # для .NET Framework 4.7, чтобы прочитать файл MS-Access и сохранить его в базе данных PostGIS.

У меня проблемы с запуском EF6Point объект является классом NetTopology, а не другой таблицей.

Когда я читаю запись моих данных из моей базы данных PostGIS, я получаю эту ошибку:

System.Data.Entity.ModelConfiguration.ModelValidationException
  HResult=0x80131500
  Message=One or more validation errors were detected during model generation:

Importer.Point: : EntityType 'Point' has no key defined. Define the key for this EntityType.
Points: EntityType: EntitySet 'Points' is based on type 'Point' that has no keys defined.

Вот некоторый код:

    public static void Main(string[] args)
    {
        // Place this at the beginning of your program to use NetTopologySuite everywhere (recommended)
        NpgsqlConnection.GlobalTypeMapper.UseNetTopologySuite();

        using (var context = new PostGisContext())
        {
            var newKey = context.MyLocations.Count();
        }
    }

context.MyLocations.Count() выдает ошибку.

public class PostGisContext : DbContext
{
    public DbSet<MyLocation> MyLocations { get; set; }

    public PostGisContext() : base("name=PostgreSql")
    {        }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // PostgreSQL uses the data schema by default - not dbo.
        modelBuilder.HasDefaultSchema("data");

        // Don't use plural table names:
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        // Change CamelCase to lower-case:
        modelBuilder.Types().Configure(c => c.ToTable(LowerCaseTableName(c.ClrType)));

        modelBuilder.Conventions.Add(new LowerCaseConvention());

        base.OnModelCreating(modelBuilder);
    }

    private static string LowerCaseTableName(Type type)
    {
        var result = Regex.Replace(type.Name, ".[A-Z]", m => m.Value[0] + "_" + m.Value[1]);

        return result.ToLower();
    }
}

// A custom convention.
internal class LowerCaseConvention : IStoreModelConvention<EdmProperty>
{
    public void Apply(EdmProperty property, DbModel model)
    {
        property.Name = Regex.Replace(property.Name, ".[A-Z]", m => m.Value[0] + "_" + m.Value[1]).ToLower();
    }
}

При изменении столбца Location на строку приведенный выше код работает нормально.

public class MyLocation
{
    [Key] 
    public int Id { get; set; }
    public string LocationId { get; set; }
    public NetTopologySuite.Geometries.Point Location { get; set; }
} 

public class NpgSqlConfiguration : DbConfiguration
{
    public NpgSqlConfiguration()
    {
        const string name = "Npgsql";

        SetProviderFactory(providerInvariantName: name, 
            providerFactory: NpgsqlFactory.Instance);

        SetProviderServices(providerInvariantName: name, 
            provider: NpgsqlServices.Instance);

        SetDefaultConnectionFactory(connectionFactory: new NpgsqlConnectionFactory());
    }
}

IДолжно быть, я забыл об обстановке или о чем-то, но я не могу ее найти.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 03 октября 2018

NetTopologySuite и PostGIS не поддерживаются в Entity Framework 6, только в Entity Framework Core.Это связано с тем, что система типов EF6 закрыта и не позволяет использовать гибкие специфичные для поставщика расширения, как это делает EF Core.

...