簡體   English   中英

EF6配置必需的可選關系(一對一或一對一)

[英]EF6 Configuring a Required-to-Optional Relationship (One-to–Zero-or-One

我有兩個名為的數據庫表

SegmentSet SegmentSetGeometry

它們都有名為SegmentSetId主鍵。 (SegmentSetGeometry(從屬)segmentSetId是SegmentSet(primary)的外鍵)。

SegmentSets可以有0或1個SegmentSetGeometries

我有兩個代表這些表的類,叫做SegmentSetSegmentSetGeometry

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM