Entity Framework代码优先支持只读导航属性吗?

4
目前我使用Entity Framework Code First来创建我的领域模型。如下面的代码所示,我想在“Test2”类和“Test1”类之间创建一对多的关联。但是当我运行应用程序时,它抛出了一个异常:
“ T2 ”导航属性不是类型 “Test1” 上的已声明属性。请验证它没有被显式地从模型中排除,并且它是一个有效的导航属性。
如果我将导航属性“T2”修改为具有“protected”或公共setter,则可以正常工作。因此,似乎Entity Framework不支持只读导航属性。有人能解释一下并给一些关于这个问题的链接吗?
public abstract class Test1Base
{
    public int Id {get; set}
    public virtual Test2 T2 {get; private set;}   
} 

public class Test1 : Test1Base
{

}

public class Test2
{
    public int Id {get; set;}
    public string Name {get; set;}
}

public class MyDbContext : DbContext
{
    public DbSet<Test1> Test1Table {get; set;}
    public DbSet<Test2> Test2Table {get; set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         base.OnModelCreating(modelBuilder);
         modelBuilder.Entity<Test1>().HasRequired(t => t.T2).WithMany();
    }
}
1个回答

1

这可能是代码优先中的一些小限制,不是由私有setter引起的,而是由基类中的私有setter和派生类的映射引起的。如果您将T2声明从Test1Base移动到Test1,它将使用私有setter工作,但如果您想将其保留在Test1Base中,请将setter设置为受保护。


是的,我必须使setter在派生类中可见。 - user1012036
我们在这个区域已经有一个错误,直到EF5后才会得到修复。我会跟进并确保它被该错误覆盖,或者适当地提交新的错误报告。 - Arthur Vickers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接