[英]EF6 Required-to-Optional Relationship (One-to–Zero-or-One) not working correctly
[英]EF6 Configuring a Required-to-Optional Relationship (One-to–Zero-or-One
我有两个名为的数据库表
SegmentSet SegmentSetGeometry
它们都有名为SegmentSetId
主键。 (SegmentSetGeometry(从属)segmentSetId是SegmentSet(primary)的外键)。
SegmentSets可以有0或1个SegmentSetGeometries
我有两个代表这些表的类,叫做SegmentSet
和SegmentSetGeometry
:
public class SegmentSet
{
public long SegmentSetId { get; set; }
// ...
public virtual SegmentSetGeometry SegmentSetGeometry { get; set; }
}
public class SegmentSetGeometry
{
public long SegmentSetId { get; set; }
public DbGeometry Geometry { get; set; }
public virtual SegmentSet SegmentSet { get; set; }
}
以下是他们的配置:
public class SegmentSetConfiguration: EntityTypeConfiguration<SegmentSet>
{
public SegmentSetConfiguration()
{
ToTable("SegmentSet");
HasKey(x => x.SegmentSetId);
// ...
HasOptional(x => x.SegmentSetGeometry)
.WithRequired(x => x.SegmentSet);
}
}
public class SegmentSetGeometryConfiguration : EntityTypeConfiguration<SegmentSetGeometry>
{
public SegmentSetGeometryConfiguration()
{
ToTable("SegmentSetGeometry");
HasKey(x => x.SegmentSetId);
}
}
尝试从数据库中获取SegmentSet
,会显示以下错误:
Invalid column name 'SegmentSet_SegmentSetId'.
我找到了这个参考https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/relationships并决定切换关系并尝试:
public class SegmentSetConfiguration: EntityTypeConfiguration<SegmentSet>
{
public SegmentSetConfiguration()
{
ToTable("SegmentSet");
HasKey(x => x.SegmentSetId);
// ...
}
}
public class SegmentSetGeometryConfiguration : EntityTypeConfiguration<SegmentSetGeometry>
{
public SegmentSetGeometryConfiguration()
{
ToTable("SegmentSetGeometry");
HasKey(x => x.SegmentSetId);
HasRequired(x => x.SegmentSet)
.WithOptional(x=>x.SegmentSetGeometry);
}
}
但仍然行不通。 我正在使用他们提供的示例而且它不起作用,我已经查看了所有类似的堆栈溢出但仍然无法正常工作
要将这两者映射到一起,您应该从关系的所需方面进行映射,并且仅映射到那一方。 映射双方都可能导致EF出现一些乱码,这可能会导致您的问题。
public class SegmentSet
{
public long SegmentSetId { get; set; }
// ...
public virtual SegmentSetGeometry Geometry { get; set; }
}
public class SegmentSetGeometry
{
public long SegmentSetId { get; set; }
// ...
public virtual SegmentSet SegmentSet { get; set; }
}
public class SegmentSetConfiguration: EntityTypeConfiguration<SegmentSet>
{
public SegmentSetConfiguration()
{
ToTable("SegmentSets");
HasKey(x => x.SegmentSetId);
// Note: Do not map the HasOptional here... Only map the required on the other side.
}
}
public class SegmentSetGeometryConfiguration : EntityTypeConfiguration<SegmentSetGeometry>
{
public SegmentSetGeometryConfiguration()
{
ToTable("SegmentSetGeometries");
HasKey(x => x.SegmentSetId);
HasRequired(x => x.SegmentSet)
.WithOptional(x=>x.Geometry);
}
}
对于1..0 / 1关系,使用每个表上的PK可以正常工作。
编辑:还要检查是否正在加载实体配置。 这可能解释了EF回归常规。 在DbContext中:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.AddFromAssembly(GetType().Assembly);
}
以上假设实体类型配置与DbContext定义在同一个程序集中。 否则: typeof(SegmentSetGeometryConfiguration).Assembly
可以解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.