简体   繁体   English

EF6配置必需的可选关系(一对一或一对一)

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

I have two database tables called 我有两个名为的数据库表

SegmentSet SegmentSetGeometry SegmentSet SegmentSetGeometry

They both have primary key called SegmentSetId . 它们都有名为SegmentSetId主键。 (The SegmentSetGeometry (dependent) segmentSetId is foreign key to SegmentSet (primary)). (SegmentSetGeometry(从属)segmentSetId是SegmentSet(primary)的外键)。

SegmentSets can have 0 or 1 SegmentSetGeometries SegmentSets可以有0或1个SegmentSetGeometries

I have two classes representing these tables called SegmentSet and SegmentSetGeometry : 我有两个代表这些表的类,叫做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; }
}

Here are their configurations: 以下是他们的配置:

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);
    }
}

When attempting to get a SegmentSet from the database the following error shows up: 尝试从数据库中获取SegmentSet ,会显示以下错误:

Invalid column name 'SegmentSet_SegmentSetId'.

I found this reference https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/relationships and decided to switch the relationship and tried: 我找到了这个参考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);

    }
}

But still doesn't work. 但仍然行不通。 I am using the example they give and it's not working, and I have looked at all the similar stack overflows and still not working 我正在使用他们提供的示例而且它不起作用,我已经查看了所有类似的堆栈溢出但仍然无法正常工作

To map these two together, you should map from the required side of the relationship, and only that one side. 要将这两者映射到一起,您应该从关系的所需方面进行映射,并且仅映射到那一方。 Mapping both sides can lead to EF getting a bit garbled which may be causing your issue. 映射双方都可能导致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);

    }
}

That should work as expected using the PK's on each table for the 1..0/1 relationship. 对于1..0 / 1关系,使用每个表上的PK可以正常工作。

Edit: It's also worth checking that the Entity configurations are being loaded. 编辑:还要检查是否正在加载实体配置。 That might explain EF falling back on convention. 这可能解释了EF回归常规。 In the DbContext: 在DbContext中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Configurations.AddFromAssembly(GetType().Assembly);
}

The above assumes the Entity Type Configs are in the same assembly as the DbContext definition. 以上假设实体类型配置与DbContext定义在同一个程序集中。 Otherwise: typeof(SegmentSetGeometryConfiguration).Assembly would do the trick. 否则: typeof(SegmentSetGeometryConfiguration).Assembly可以解决问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM