N层实体框架因连接查询失败

时间:2014-04-16 08:28:59

标签: c# entity-framework n-tier-architecture

我正在开发基于此框架的VS2010解决方案:http://ntieref.codeplex.com/ 一切都很好,我可以查询我的数据库(MS SQLServer 2008)并保存更改。

现在我正在尝试查询一个表(Projects)加入另一个表(项目用户关联)并按键过滤(用户键),如下所示:

var query = from p in ctx.C__E_PROJECTS.AsQueryable()
            join pu in ctx.CUMR_USER_PROJECTS_ASSOCIATION.AsQueryable() on p.CD_PROJECT equals pu.RF_PROJECT
            where pu.RF_USER == 1
            select p;

但我收到[System.NotImplementedException] = {“方法或操作未实现。”} at NTier.Client.Domain \ QueryProvider.cs:第382行(它是N层实体框架库的一部分)。

同样替换这样的连接会产生相同的异常:

var query2 = from p in ctx.C__E_PROJECTS.AsQueryable()
             from pu in ctx.CUMR_USER_PROJECTS_ASSOCIATION.AsQueryable()
             where p.CD_PROJECT == pu.RF_PROJECT
                && pu.RF_USER == 1
             select p;

我做错了吗? 是否有另一种方法可以在与另一个表的连接中过滤表?

这是两个表的定义: (其中实体是NTier.Common.Domain.Model.Entity)

[DataContract(IsReference = true)]
[KnownType(typeof(C__E_PROJECT_VERSIONS))]
[KnownType(typeof(CUMR_USER_PROJECTS_ASSOCIATION))]
[MetadataType(typeof(C__E_PROJECTSMetadata))]
public class C__E_PROJECTS : Entity<C__E_PROJECTS>, INotifyPropertyChanged, INotifyPropertyChanging, IDataErrorInfo
{
    public C__E_PROJECTS();

    [DataMember]
    [NavigationProperty]
    public TrackableCollection<C__E_PROJECT_VERSIONS> C__E_PROJECT_VERSIONS { get; set; }
    [DataMember]
    [Required]
    [SimpleProperty]
    [ServerGeneration(1)]
    [Key]
    public int CD_PROJECT { get; set; }
    [NavigationProperty]
    [DataMember]
    public TrackableCollection<CUMR_USER_PROJECTS_ASSOCIATION> CUMR_USER_PROJECTS_ASSOCIATION { get; set; }
    [DataMember]
    [SimpleProperty]
    public string DS_PROJECT { get; set; }
    [SimpleProperty]
    [DataMember]
    [Required]
    public string ID_PROJECT { get; set; }

    protected override void ClearNavigationProperties();
    protected override int GetKeyHashCode();
    protected override bool IsKeyEqual(C__E_PROJECTS entity);
}

[DataContract(IsReference = true)]
    [KnownType(typeof(CUME_USERS))]
    [MetadataType(typeof(CUMR_USER_PROJECTS_ASSOCIATIONMetadata))]
    [KnownType(typeof(C__E_PROJECTS))]
    public class CUMR_USER_PROJECTS_ASSOCIATION : Entity<CUMR_USER_PROJECTS_ASSOCIATION>, INotifyPropertyChanged, INotifyPropertyChanging, IDataErrorInfo
    {
        public CUMR_USER_PROJECTS_ASSOCIATION();

        [NavigationProperty]
        [DataMember]
        public C__E_PROJECTS C__E_PROJECTS { get; set; }
        [DataMember]
        [SimpleProperty]
        public bool? CAN_READ { get; set; }
        [DataMember]
        [NavigationProperty]
        public CUME_USERS CUME_USERS { get; set; }
        [DataMember]
        [Key]
        [Required]
        [SimpleProperty]
        public int RF_PROJECT { get; set; }
        [SimpleProperty]
        [Key]
        [DataMember]
        [Required]
        public int RF_USER { get; set; }

        protected override void ClearNavigationProperties();
        protected override int GetKeyHashCode();
        protected override bool IsKeyEqual(CUMR_USER_PROJECTS_ASSOCIATION entity);
    }


作为一种解决方法,我在SQL Server存储过程中实现了连接查询,该过程返回查询结果,并将存储过程添加到edmx模型中。一切都好。
现在保存edmx或运行“N-Tier Entity Generator”自定义工具,我希望在客户端的上下文中具有相关功能,但它缺失了。我可以在XXX.Server.Domain.Repositories项目中看到它,但它不会传播到客户端。我是否必须编辑T4模板?

谢谢! 罗伯特

2 个答案:

答案 0 :(得分:1)

关于您的更新,请尝试以下操作:

var query = from p in ctx.PROJECTS.AsQueryable().Include("USER_PROJECTS_ASSOCIATION")
            from q in p.USER_PROJECTS_ASSOCIATION.AsQueryable()
            where q.USER_PROJECTS_ASSOCIATION.RF_USER==1
            select p; // or try Select q;

我希望它会对你有所帮助。

答案 1 :(得分:0)

一般......

N-Tier Entity Framework生成客户端和服务器代码,以查询支持排序(orderby等),过滤(where),分页(skip和take)以及包括关系(include)的实体。此操作是端到端的,即客户端定义linq查询,通过WCF传输到服务器并最终在数据库上执行。可以在服务器(DataService)或客户端数据上下文(DataContext)上手动添加更复杂的查询操作,如投影,聚合和连接。所有相关的接口和类都是部分生成的,我可以使用部分接口和类轻松扩展:

服务器上的

-   partial interface IMyDataService
-   partial class MyDataService

并在客户端

-   partial interface IMyDataContext
-   partial class MyDataContext

此外,框架生成的代码不会自动公开存储过程。如果您愿意,可以修改代码生成(T4文件)或将自定义方法添加到数据服务和客户端数据上下文。

在您的情况下......

根据您的意图,您可以执行以下操作:

var query = 
  from p in ctx.PROJECTS.AsQueryable()
                        .Include(“USER_PROJECTS_NAVIGATION_PROPERTY”)
  where p.USER_PROJECTS_NAVIGATION_PROPERTY.RF_USER == 1
  select p;

或者,如果您需要更复杂的东西,请使用上面列出的分部类将其实现为自定义方法。