我有一个对象,该对象包含具有另一个对象类型的属性,我想将其视为“复杂类型”。
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
,而不要引用另一个表。
答案 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
属性。请看以下问题以了解操作方法:
答案 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; }
}
这将创建一个包含属性Id
,Coordinate_Latitued
,Coordinate_Longitude
的表。