我有以下课程定义
public abstract class AbstractClass
{
[Key]
public string Name { get; set; }
public virtual IndependentClass IndependentClass { get; set; }
public string IndependentClassName { get { return IndependentClass == null ? "<NULL>" : IndependentClass.Name; } }
}
public class Impl1 : AbstractClass
{
}
public class Impl2 : AbstractClass
{
}
public class IndependentClass
{
[Key]
public string Name { get; set; }
public virtual Impl1 Impl1 { get; set; }
public virtual ICollection<Impl2> Impl2s { get; set; }
}
这些在我的
Context.OnModelCreating
中:modelBuilder.Entity<AbstractClass>().HasOptional(abs => abs.IndependentClass);
modelBuilder.Entity<IndependentClass>().HasRequired(ind => ind.Impl1);
modelBuilder.Entity<IndependentClass>().HasMany(ind => ind.Impl2s);
我的初始化看起来像这样(将数组添加到上下文并修剪了
context.SaveChanges()
)var impl1s = new[]
{
new Impl1() { Name = "a" },
new Impl1() { Name = "b" },
new Impl1() { Name = "c" }
}
var inds = new[]
{
new IndependentClass() { Name = "A", Impl1 = impl1s[0] },
new IndependentClass() { Name = "B", Impl1 = impl1s[1] }
}
var impl2s = new[]
{
new Impl2() { Name = "a1", IndependentClass = inds[0] },
new Impl2() { Name = "a2", IndependentClass = inds[0] },
new Impl2() { Name = "b1", IndependentClass = inds[1] },
new Impl2() { Name = "b2", IndependentClass = inds[1] },
new Impl2() { Name = "c1", IndependentClass = null }
}
最后,我有一个简单的View,可以转储每个db集合。我的问题是导航属性没有像我需要的那样填充。即,我的观点的输出是这样的:
Independent Classes:
A: Impl1 = a, Impl2s = []
B: Impl1 = b, Impl2s = []
Impl1s
a: IndependentClass = <NULL>
b: IndependentClass = <NULL>
c: IndependentClass = <NULL>
Impl2s
a1: IndependentClass = A
a2: IndependentClass = A
b1: IndependentClass = B
b2: IndependentClass = B
c1: IndependentClass = <NULL>
IndepdendentClass应填充其Impl2,前两个Impl1应填充IndependentClass。
谁能告诉我我在做什么错?
最佳答案
您的模型与以下导航属性具有三种关系:AbstractClass.IndependentClass
IndependentClass.(NoNavigationProperty)
IndependentClass.Impl1
Impl1.(NoNavigationProperty)
IndependentClass.Impl2s
Impl2.(NoNavigationProperty)
对于每个关系,关联的一端不作为导航属性公开。在此模型中不期望...
IndepdendentClass应填充其Impl2,并且
前两个Impl1应该填充IndependentClasses
...因为您没有在初始化代码中填充IndependentClass.Impl2s
,也不填充Impl1.IndependentClass
。您填写了Impl2.IndependentClass
,但是因为此导航属性属于另一个关系,所以它根本不影响IndependentClass.Impl2s
。
如果您实际上想要两个关系...IndependentClass.Impl1
Impl1.IndependentClass
(一对一)IndependentClass.Impl2s
Impl2.IndependentClass
(一对多)
...只要您的AbstractClass
是模型中具有自己表的实体,就无法实现,因为您必须在声明它们的类型的导航属性之间进行映射,并且Impl1.IndependentClass
和Impl2.IndependentClass
是继承的属性,但未在Impl1
和Impl2
中声明。
如果您不将AbstractClass
设为实体,即,不要在映射代码中使用此抽象类,并且上下文类中没有DbSet<AbstractClass>
,则上述两种关系都是可能的。对于EF,您的模型没有任何继承,而是将Impl1
(和Impl2
)视为仅包含自己的属性以及基类的属性的实体,就好像它是一个没有基类的类一样。
这就是您自己的答案中的映射按预期工作的原因:您已经使用Fluent API明确定义了IndependentClass.Impl1
和Impl1.IndependentClass
之间的一对一关系。通过将约定命名为一对多关系,可以自动检测到IndependentClass.Impl2s
和Impl2.IndependentClass
之间的第二种关系。