Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF CRUD DAL实体框架的推荐结构_Wcf_Entity Framework_Entity Framework 4_Crud - Fatal编程技术网

WCF CRUD DAL实体框架的推荐结构

WCF CRUD DAL实体框架的推荐结构,wcf,entity-framework,entity-framework-4,crud,Wcf,Entity Framework,Entity Framework 4,Crud,我需要为应用程序实现一个后台层。它必须通过EF4实现数据访问,并通过WCF服务将数据访问公开为CRUD。使用WCF数据服务不是一个选项,因为要求公开TCP服务端点 我看到Vs 2010中的EF附带了三个EF代码生成器模板: DbContextgenerator,将从DbContext派生的上下文和实体类生成为非常简单的POCO,无需额外代码 public partial class MyEntities : DbContext {...} 和实体类 .... public int EmailA

我需要为应用程序实现一个后台层。它必须通过EF4实现数据访问,并通过WCF服务将数据访问公开为CRUD。使用WCF数据服务不是一个选项,因为要求公开TCP服务端点

我看到Vs 2010中的EF附带了三个EF代码生成器模板:

  • DbContext
    generator,将从
    DbContext
    派生的上下文和实体类生成为非常简单的POCO,无需额外代码

    public partial class MyEntities : DbContext
    {...}
    
    和实体类

    ....
    public int EmailAddressLocatorID { get; set; }
    ....
    public virtual Address Address { get; set; }
    ....
    public virtual ICollection<HouseholdGuest> HouseholdGuests { get; set; }
    
    其中,FixupCollection是
    ObservableCollection
    的简单增强,实现
    ClearItems
    InsertItem,
    如下

    public class FixupCollection<T> : ObservableCollection<T>
    {
        protected override void ClearItems()
        {
            new List<T>(this).ForEach(t => Remove(t));
        }
    
        protected override void InsertItem(int index, T item)
        {
            if (!this.Contains(item))
            {
                base.InsertItem(index, item);
            }
        }
    } 
    
    public类FixupCollection:ObservableCollection
    {
    受保护的覆盖无效ClearItems()
    {
    新列表(this).ForEach(t=>Remove(t));
    }
    受保护的覆盖无效插入项(int索引,T项)
    {
    如果(!this.Contains(项目))
    {
    基本插入项(索引,项目);
    }
    }
    } 
    
    我想征求您的意见,其中哪一个更适合用于通过WCF服务实施CRUD,以及关于实施此服务的最佳实践的一些指南

    谢谢

  • 这可能是你提到的最好的方法,但需要付出最大的努力。首先,您必须使您的实体可通过WCF进行序列化=您必须修改生成器以使用
    DataContract(IsReference=true)
    DataMember
    属性,否则序列化对象图时将出现循环引用异常(实体及其关系,其中主体和从属对象彼此都具有导航属性)。一旦使用对象图,您还必须进行自己的更改跟踪或数据合并,因为。如果您不打算传输对象图,而只传输单个对象或相同对象的列表,您应该同意这种方法
  • EntityObject
    特定于实体框架,将其公开给客户端是一个坏主意。默认情况下,它可以由WCF序列化,但它也传输特定于EF的信息,如
    EntityKey
    。服务点应该是隐藏其内部实现,并且公开基于
    EntityObject
    的实体是违法的它也不能解决变更跟踪问题
  • STE是为客户端制造而设计的,但它们不是万能的。服务和客户端应仅共享描述交换消息的契约。STE违反此规则,因为它们包含逻辑,客户端必须知道并使用此逻辑。STE基于服务和所有客户端之间共享实体程序集=或相同的逻辑不能在非.NET平台上重新实现。它们还始终传输整个对象图-如果在图中加载100个实体,则将它们发送回客户端,客户端将更改图中的单个实体,默认情况下,将所有100个实体发送回服务
  • POCO生成器通常与第一种方法相同。它只使用ObjectContext API而不是DbContext API。修复方法是特定于服务的,客户端不会知道它们

  • 最后一种方法是使用自定义非实体类(DTOs=数据传输对象)和隐藏服务中DTO和实体之间的转换。这将允许您创建更复杂和合适的对象集,但也会使您的应用程序更复杂并增加开发复杂性。这也是实现您自己的更改跟踪时的选项。

    谢谢您的建议。我从DbContext开始方法
    public class FixupCollection<T> : ObservableCollection<T>
    {
        protected override void ClearItems()
        {
            new List<T>(this).ForEach(t => Remove(t));
        }
    
        protected override void InsertItem(int index, T item)
        {
            if (!this.Contains(item))
            {
                base.InsertItem(index, item);
            }
        }
    }