繁体   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