【问题标题】:Does the Entity Framework code first support readonly navigation propertyEntity Framework 代码是否首先支持只读导航属性
【发布时间】:2012-04-22 12:48:47
【问题描述】:

目前我首先使用实体​​框架代码来创建我的域模型。正如下面的代码所示,我想在“Test2”类和“Test1”类之间创建一个一对多的关联。但是当我运行应用程序时,它抛出了一个异常:

导航属性“T2”不是类型上的声明属性 '测试1'。确认它没有被明确排除在 模型并且它是一个有效的导航属性。

如果我修改导航属性“T2”以使其具有“受保护”或公共设置器。没关系。所以看起来实体框架不支持只读导航属性。谁能解释一下这个问题并给出一些链接?

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

【问题讨论】:

    标签: entity-framework properties navigation code-first readonly


    【解决方案1】:

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

    【讨论】:

    • 是的。我必须让 setter 在派生类中可见。
    • 我们在这方面已经有一个错误,直到 EF5 之后才会得到修复。我将对此进行跟进,并确保它被该错误所覆盖或酌情提交一个新错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2013-01-25
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多