EF可选的一对多多重错误
EF optional one to many multiplicity error
我有一个非常简单的模式,针对这个问题进一步简化了
Table: Airport
IATA char(3) Primary Key
Name varchar(20)
Table: Airport_Terminal
IATA char(3) (comp key1)
TerminalName (comp key2)
POCOs
public sealed class Airport
{
[Key]
public string IATA { get; set; }
public string Name { get; set; }
public ICollection<AirportTerminal> Terminals { get; set; }
}
public class AirportTerminal
{
[Key, Column(Order = 0)]
public string IATA { get; set; }
[Key, Column(Order = 1)]
public string Terminal { get; set; }
public Airport Airport { get; set; }
}
机场航站楼配置
modelBuilder.Entity<AirportTerminal>()
.HasOptional<Airport>(s => s.Airport)
.WithMany(s => s.Terminals)
.HasForeignKey(s => s.IATA);
有些机场(在我的申请中)有多个航站楼,有些则没有。当为给定机场定义了航站楼时,我只想对航站楼 属性 做出反应。如果我为每个机场输入一条记录,则此配置有效。但是当我尝试查找任何机场时,我得到:
"One or more validation errors were detected during model generation: Multiplicity conflicts with the referential constraint in Role 'AirportTerminal_Airport_Target' in relationship 'AirportTerminal_Airport'. Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'."
研究表明,当可选成员上存在不可为 null 的 属性,因此无法将其设置为 null 时,会发生此错误。 AirportTerminal 包含两个字符串,可为空。
有什么想法吗?
考虑只使用表的键。这最好代替多键。放置索引约束以确保属性 IATA
和 Terminal
.
中的唯一性
POCO:
public sealed class Airport
{
[Key]
public Guid Id { get; set; }
public string IATA { get; set; }
public string Name { get; set; }
public ICollection<AirportTerminal> Terminals { get; set; }
}
public class AirportTerminal
{
[Key]
public Guid Id { get; set; }
public string IATA { get; set; }
public string Terminal { get; set; }
public Airport Airport { get; set; }
public Guid? AirportId { get; set; }
}
配置:
modelBuilder.Entity<AirportTerminal>()
.HasOptional<Airport>(s => s.Airport)
.WithMany(s => s.Terminals)
.HasForeignKey(s => s.AirportId);
我有一个非常简单的模式,针对这个问题进一步简化了
Table: Airport
IATA char(3) Primary Key
Name varchar(20)
Table: Airport_Terminal
IATA char(3) (comp key1)
TerminalName (comp key2)
POCOs
public sealed class Airport
{
[Key]
public string IATA { get; set; }
public string Name { get; set; }
public ICollection<AirportTerminal> Terminals { get; set; }
}
public class AirportTerminal
{
[Key, Column(Order = 0)]
public string IATA { get; set; }
[Key, Column(Order = 1)]
public string Terminal { get; set; }
public Airport Airport { get; set; }
}
机场航站楼配置
modelBuilder.Entity<AirportTerminal>()
.HasOptional<Airport>(s => s.Airport)
.WithMany(s => s.Terminals)
.HasForeignKey(s => s.IATA);
有些机场(在我的申请中)有多个航站楼,有些则没有。当为给定机场定义了航站楼时,我只想对航站楼 属性 做出反应。如果我为每个机场输入一条记录,则此配置有效。但是当我尝试查找任何机场时,我得到:
"One or more validation errors were detected during model generation: Multiplicity conflicts with the referential constraint in Role 'AirportTerminal_Airport_Target' in relationship 'AirportTerminal_Airport'. Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'."
研究表明,当可选成员上存在不可为 null 的 属性,因此无法将其设置为 null 时,会发生此错误。 AirportTerminal 包含两个字符串,可为空。
有什么想法吗?
考虑只使用表的键。这最好代替多键。放置索引约束以确保属性 IATA
和 Terminal
.
POCO:
public sealed class Airport
{
[Key]
public Guid Id { get; set; }
public string IATA { get; set; }
public string Name { get; set; }
public ICollection<AirportTerminal> Terminals { get; set; }
}
public class AirportTerminal
{
[Key]
public Guid Id { get; set; }
public string IATA { get; set; }
public string Terminal { get; set; }
public Airport Airport { get; set; }
public Guid? AirportId { get; set; }
}
配置:
modelBuilder.Entity<AirportTerminal>()
.HasOptional<Airport>(s => s.Airport)
.WithMany(s => s.Terminals)
.HasForeignKey(s => s.AirportId);