Сложный тип требует первичного ключа - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть объект, который содержит атрибут с типом другого объекта, который я хочу рассматривать как сложный тип.

public class Location : IModule
{
    public string Id { get; set; }
    public Coordinate Coordinate { get; set; }
}

[ComplexType]
public class Coordinate
{
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

При добавлении миграции я столкнулся с проблемой первичного ключа.требуется (именно то, что я хочу предотвратить).

Тип сущности Coordinate требует определения первичного ключа.

РЕДАКТИРОВАТЬ

Из соображений производительности я хочу, чтобы свойства сохранялись как Coordinate_Latitude и Coordinate_Longitute вместо ссылки на другую таблицу.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Основываясь на этом вопросе ( Как реализовать простой «сложный тип» в Entity Framework Core 2 / C #? ), я нашел ответ: собственные типы объектов делают свое дело.

public class Location : IModule
{
    public string Id { get; set; }
    public Coordinate Coordinate { get; set; }
}

[Owned]
public class Coordinate
{
    public string Latitude { get; set; }
    public string Longitude { get; set; }
}

Это создает таблицу, содержащую атрибуты Id, Coordinate_Latitued, Coordinate_Longitude.

0 голосов
/ 21 ноября 2018

Вам нужно определить ключ, чтобы он работал.Вот как работает Entity Framework, Entity Framework необходимо знать ключ для отслеживания объекта при выполнении операции обновления или удаления .Просто если вы не хотите вставлять его вручную, вы можете объявить его как столбец идентификаторов, чтобы автоматически увеличивать его.Примерно так:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CoordinateKey { get; set; }

Или с Fluent-API:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Coordinate>().HasKey(u => u.CoordinateKey);
    modelBuilder.Entity<Coordinate>().Property(c => c.CoordinateKey)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}

Редактировать : кажется, вы хотите трактовать класс Coordinate как несопоставленный класс.Вы можете использовать атрибут NotMapped.Взгляните на следующий вопрос, чтобы узнать как:

Сначала код Entity Framework: Как игнорировать классы

...