背景
我的课程看起来或多或少是这样的:
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
属性来实现迁移工作,但这没有意义,也不是一个有用的属性;它只是在表上创建了另一个外键,但在我的模型中不需要这样做。
所以,总结一下:
如何让这个结构按照我想要的方式工作?我认为秘密在于一些Fluent地图伏都教,但我对这个图书馆非常不熟悉,而且我不知道如何让它工作。
为什么添加第三个(不需要的,不需要的)属性会修复所有内容并允许迁移到脚手架?
答案 0 :(得分:0)
您的流畅映射是完全错误的。
你应该这样做:
modelBuilder.Entity<MyClass>().HasOptional(p => p.ChildOne).WithOptionalDependent();
modelBuilder.Entity<MyClass>().HasOptional(p => p.ChildTwo).WithOptionalDependent();