没有为多个列上的键定义键

本文关键字:定义 | 更新日期: 2023-09-27 18:31:37

我正在使用C#和实体框架。我想将SimulationParameter对象的键定义为三列(名称、研究 ID、模拟 ID)的组合。我不需要 ID 列,因为这三个元素的组合将始终是唯一的。

仿真参数:

public class SimulationParameter : IAggregateRoot
    {
        public SimulationParameter()
        {
        }
        public String SimulationId { get; set; }
        public Guid StudyId { get; set; }
        public Study Study { get; set; }
        public String Name { get; set; }
        public String Value { get; set; }        
    }

仿真参数映射:

class SimulationParameterMap : EntityTypeConfiguration<SimulationParameter>
    {
        public SimulationParameterMap()
        {
          HasKey(e => new {SimulationId = e.SimulationId, Name = e.Name, StudyId = e.StudyId});            
        Property(e => e.SimulationId)
            .IsRequired(); 
        Property(e => e.Name)
            .IsRequired(); 
        Property(e => e.Value)
            .IsRequired();
        HasRequired(e => e.Study)
            .WithMany(e => e.SimulationsParameters)
            .HasForeignKey(s => s.StudyId);
        ToTable("SimulationParameters");
        }
    }

现在,当我尝试创建模型时,出现以下错误:

    EntityType 'SimulationParameter' has no key defined. Define the key for this EntityType.
SimulationParameters: EntityType: EntitySet 'SimulationParameters' is based on type 'SimulationParameter' that has no keys defined.

我真的不知道为什么这是无效的......

编辑 1:

根据建议,我在模型中的字段上方添加了 [Key] 属性:

 public class SimulationParameter : IAggregateRoot
    {
        public SimulationParameter()
        {
        }
        [Key]
        public String SimulationId { get; set; }
        [Key]
        public Guid StudyId { get; set; }
        public Study Study { get; set; }
        [Key]
        public String Name { get; set; }
        public String Value { get; set; }
    }

并得到一个不同的错误:

System.InvalidOperationException: Unable to determine composite primary key ordering for type 'SimulationParameter'. Use the ColumnAttribute (see http://go.microsoft.com/fwlink/?LinkId=386388) or the HasKey method (see http://go.microsoft.com/fwlink/?LinkId=386387) to specify an order for composite primary keys.

编辑2

我能够通过以下方式使其工作:

  public class SimulationParameter : IAggregateRoot
    {
        public SimulationParameter()
        {
        }
        [Key, Column(Order=1)]
        public String SimulationId { get; set; }
        [Key, Column(Order = 2)]
        public Guid StudyId { get; set; }
        public Study Study { get; set; }
        [Key, Column(Order = 3)]
        public String Name { get; set; }
        public String Value { get; set; }

    }

虽然它不能使用流利,但仍然很奇怪,我会继续寻找并随时通知您。

没有为多个列上的键定义键

不能将另一个类中的属性用作主键:e.Study.IdSimulationParameter数据库中还应该有一个StudyId(或类似的东西)。只需将此字段放入类中并使其成为键的一部分:

public class SimulationParameter : IAggregateRoot
{
    public SimulationParameter()
    {
    }
    public String SimulationId { get; set; }
    [ForeignKey("Study")]
    public int StudyId { get; set; }
    public Study Study { get; set; }
    public String Name { get; set; }
    public String Value { get; set; }            
}

或者,使用流畅映射:

HasRequired(e => e.Study)
.WithMany(e => e.SimulationsParameters)
.HasForeignKey(s => s.StudyId);