EF Core:使参考对象只读,但仍可包含

时间:2017-03-15 13:53:05

标签: c# entity-framework-core

我有以下课程:

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

我想使引用导航属性只读,以确保无法通过主体实体更改依赖实体。

我试过这样:

public Blog Blog { get; }

但是当我尝试执行Include时出现以下错误: "表达式' [post]。博客'传递给Include运算符无法绑定。"

如何将参考导航属性设为只读但仍可包含?

1 个答案:

答案 0 :(得分:0)

如果模型类与EF上下文位于相同的程序集和命名空间中,而其他用法不是,则可以尝试制作Blog的setter internal,这将允许EF设置它但阻止来自其他地方的尝试。您可能还需要为项目调整AssemblyInfo文件,以使EntityFramework DLL和名称空间可见内部,因为实际执行该设置的代码将在那里。

请记住,虽然这会阻止其他编码人员将Blog设置为Blog类型的新实例,但现有实例仍然是可变的,因此编码人员/用户可以更新数据成员而无需更改存储的参考在Post。您可以通过内置类似于Post上的Blog属性来锁定Blog中的setter,但是您开始打开一堆关于如何对Blog进行有意更改的蠕虫;如果除了在DAL之外所有博客都是只读的,那么更改博客的唯一方法是在DAL中公开一个方法,该方法采用博客的一些可变变体,如BlogDto,并将指定的参数复制到博客宾语。如果这是你想要的,那很好,但它可能不是,你是否知道这一点。