我正在使用C#和Entity Framework。我想将SimulationParameter
对象的一个关键字定义为三列(Name、StudyId、SimulationId)的组合。由于这三个元素的组合始终是唯一的,因此我不需要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; }
}
尽管使用流畅的方法仍然无法正常工作,这仍然很奇怪。我会继续寻找并及时通知您。
SimulationParameter
是哪个类的对象?你能发布一下你的类的代码吗? - Phani[Key]
,会发生什么?你确定它能够识别你的流畅代码吗?那应该可以正常工作。 - JohnSystem.InvalidOperationException: 无法确定类型“SimulationParameter”的复合主键排序方式。请使用ColumnAttribute(请参阅http://go.microsoft.com/fwlink/?LinkId=386388)或HasKey方法(请参阅http://go.microsoft.com/fwlink/?LinkId=386387)指定复合主键的顺序。
- Etienne Noël[Key, Column(0)]
,[Key, Column(1)]
等等。 - Gert Arnold