1

我有 .Net 4.0 应用程序,它使用 EntityFramework 5.0 来访问 MS SQL 数据库中的数据。

我使用数据库优先方法。所有表格都映射到 POCO 实体,该实体具有包含从 Web 服务接收的实体的附加属性。

数据库:

WH_Product (Id, NomenklatureId, SeriesId, Quantity)

服务有这样的数据:

Nomenklature (Id, Name, Producer...)
Series (Id, Number, Date...)

POCO 实体:

Product (Id, NomenklatureId, Nomenklature, SeriesId, Series, Quantity)

我对存储库实现有疑问。我需要为 Nomenklature 和 Series 属性实现延迟加载。

我制作了 ProductProxy 类,它实现了这样的加载:

public class ProductProxy:Product
{

   private Nomenklature _nomenklature;
   public override Nomenklature Nomenklature
   {
      get
      {
         if (_nomenklature==null)
         {
            _nomenklature = <code for load Nomenklature from webService by base.NomenklatureId>
         }
         return _nomenklature;
      }
   }

   private Series _series;
   public override Series Series
   {
      get
      {
         if (_series==null)
         {
            _series = <code for load Series from webService by base.NomenklatureId>
         }
         return _series;
      }
   }
}

然后在 DbContext 中将 Person 类更改为 PersonProxy 类。

public class ProductContext:DbContext
{
   ...
   public DbSet<PersonProxy> Person {get; set;}
   ...
}

加载方法:

public List<Person> GetPersons()
{
    using (var ctx = new ProductContext())
    {
        var persons = ctx.Person.AsEnumerable().Cast<Person>().ToList();
        return persons;
    }
}

问题:这是在没有 AsEnumerable().Cast() 的情况下实现 GetPersons 方法的更好方法吗?这是用后代代理类型更改实体类型的另一种方法吗?

4

2 回答 2

2

Proxy模式正在利用多态性(“OOP 的 3 个支柱”之一),对象的消费者认为它处理了一段Person时间,事实上他正在处理一个PersonProxy. 那是可能的,因为它PersonProxy a Person,因为它源自它。

这就是为什么你可以写:

Person person = new PersonProxy();

然后在您的情况下,您的GetPersons()方法可以简单地 return IEnumerable<Person>,如下所示:

public IEnumerable<Person> GetPersons()
{
    using (var ctx = new ProductContext())
    {
        return ctx.Person;
    }
}
于 2013-08-29T09:20:17.200 回答
1

如果你认为你的实体类是轻量级的,你可以用不同的方式处理这个问题,而不用将加载逻辑放在后代代理中。

相反,让您的实体类保持简单,并在创建(物化)后将它们从外部加载。

Ladislav 的回答显示了如何获取在创建每个实体对象后触发的事件。如果您使用这种方法,请使用处理程序订阅它,该处理程序区分不同的实体类并适当地加载它们 - 有很多干净的方法可以做到这一点。

请注意,如果延迟加载这些属性对您有益,那么这种方法可能不会有用。

于 2013-08-29T08:45:24.920 回答