复杂类型需要主键

时间:2018-11-21 16:46:45

标签: c# .net entity-framework primary-key

我有一个对象,该对象包含具有另一个对象类型的属性,我想将其视为“复杂类型”。

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_LatitudeCoordinate_Longitute,而不要引用另一个表。

2 个答案:

答案 0 :(得分:2)

您需要定义一个密钥,以使其起作用。 Entity Framework needs to know the key to keep track on the object when you make an update or delete operation是实体框架的工作方式。即使您不想手动插入它,也可以将其声明为标识列以自动递增它。像这样:

[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 code first: How to ignore classes

答案 1 :(得分:1)

基于这个问题(How do I implement a simple "complex type" in 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; }
}

这将创建一个包含属性IdCoordinate_LatituedCoordinate_Longitude的表。