0

我希望数据库设置为内部的,以确保外部包只能访问和编程接口而不是具体类

例如

namespace Domain
{
    public interface IProduct
    {
        string Description { get; }
        int Id { get; }
        decimal Price { get;  }
    }
}



//Separate Person.cs file for custom logic
namespace Domain
{
    internal partial class Product :IProduct
    {
    }
}

internal partial class POS : DbContext
{
    public POS()
        : base("name=POS")
    {
    }   

    internal DbSet<Product> Products { get; set; }
}

//The other Person.cs file is generated by the .tt file 

//_context.People is null which caused the dreaded null pointer exception :(
var people = _context.People.ToList();  

一旦我通过模型浏览器将对 Person 类和 People 实体的访问设置为公共,它就会再次工作,但我想限制对内部的访问以进行包封装。

它适用于 VS2010 EF 中的 Context,但不适用于 VS2012 中的 DbContext。

任何帮助深表感谢 :}

附言

现在我刚刚编辑了 .tt 文件,如下所示

public <#=code.Escape(container)#>()
    : base("name=<#=container.Name#>")
{
    Products = Set<Product>(); 

这会生成如下实例化集合的上下文类,最好不必为模型中的每个实体集将其添加到 .tt 文件中。

internal partial class POS : DbContext
{
    public POS()
        : base("name=POS")
    {
         Products = Set<Product>(); 
    }
4

1 回答 1

0

我知道这个问题很老,但我也遇到了这个问题。根据许多其他 StackOverflow 帖子,这仍然是 EntityFramework 的行为,解决方案仍然是明确Set<>的实体集。

也就是说,我不必手动将每个实体名称添加到 .tt 文件中,而是创建了一些代码,使 TT 文件为每个实体自动生成此代码。

*.Context.tt文件中,您应该发现构造函数的代码如下所示:

    public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
        this.Configuration.LazyLoadingEnabled = false;
<#
}
#>
    }

修改它,使它现在看起来像:

   public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
        this.Configuration.LazyLoadingEnabled = false;
<#
}
#>

<#
    foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>())
    {
#>
        <#=codeStringGenerator.SetStatement(entitySet)#>

<#
}
#>
    }

在文件的下方,您应该会看到该类的类定义CodeStringGenerator,添加一个新方法(我直接在第DbSet307 行附近的方法定义下添加了我的方法):

public string SetStatement(EntitySet entitySet)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} = Set<{1}>();",
        _code.Escape(entitySet),
        _typeMapper.GetTypeName(entitySet.ElementType));
}

当您保存模板时,它应该使用模型中每个实体DbContext的语句重新生成类。Set<>添加的新实体将重新触发模板生成,并且这些新实体也将包含在构造函数中。

于 2013-09-04T16:25:56.690 回答