在实体框架

时间:2016-10-31 14:20:28

标签: c# entity-framework ef-code-first

背景

我的课程看起来或多或少是这样的:

public class MyClass 
{
    [Id]
    public long Id { get; set; }

    public string MyProperty { get; set; }
    public bool MyBoolean { get; set; } 
    public string AnotherProperty { get; set; }

    public MyClass ChildOne { get; set; }
    public MyClass ChildTwo { get; set; }
}

我需要使用存储过程来加载一组记录,但只要结构本身正确就可以。

对于MyClass的任何实例,其中一个或两个子项可以为null。 MyClass的任何实例都可以在父类中使用 - 但是孩子本身不需要知道这种关系,并且任何数量的父母都可以使用子女。 / p>

问题

使用此结构,在创建新迁移时出现以下错误:

  

无法确定之间关联的主要结束   类型'MyClass'和'MyClass'。这个协会的主要目的   必须使用关系fluent API显式配置   或数据注释。

这个错误是有道理的 - 当给出一个带有外键的对象的结构时,我并不惊讶EF很难确定主要结束。我不知道如何解决这个问题。

我尝试了一些不同的Fluent映射:

modelBuilder.Entity<MyClass>().HasOptional(x => x.ChildOne).WithOptionalPrincipal(x => x.ChildOne);
modelBuilder.Entity<MyClass>().HasOptional(x => x.ChildOne).WithOptionalDependent(x => x.ChildOne);
modelBuilder.Entity<MyClass>().HasOptional(x => x.ChildOne);

(注意:我没有同时尝试这些 - 我一次只做一次并为ChildTwo复制它。)

能够通过向MyClass添加ChildThree属性来实现迁移工作,但这没有意义,也不是一个有用的属性;它只是在表上创建了另一个外键,但在我的模型中不需要这样做。

所以,总结一下:

  1. 如何让这个结构按照我想要的方式工作?我认为秘密在于一些Fluent地图伏都教,但我对这个图书馆非常不熟悉,而且我不知道如何让它工作。

  2. 为什么添加第三个​​(不需要的,不需要的)属性会修复所有内容并允许迁移到脚手架?

1 个答案:

答案 0 :(得分:0)

您的流畅映射是完全错误的。

你应该这样做:

modelBuilder.Entity<MyClass>().HasOptional(p => p.ChildOne).WithOptionalDependent();
modelBuilder.Entity<MyClass>().HasOptional(p => p.ChildTwo).WithOptionalDependent();