[英]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.