如何在实体框架4.4中定义公共列名

时间:2014-02-05 17:46:46

标签: c# linq entity-framework

Entity Framework 4.4与Database First方法结合使用。我在大多数表中都定义了一个公共column(比如; CreateDate)。

我不想为每种类型编写日期过滤查询,并试图避免reflection我试图定义接口 ICreateDate,例如:

interface ICreateDate
{
    System.DateTime CreateDate { get; set; }
}

自动生成的课程:

//-----------------------------------------------------------------------------
// <auto-generated>
// ...
// </auto-generated>
//-----------------------------------------------------------------------------
namespace Project.Entity
{
    using System;
    using System.Collections.Generic;

    public partial class SomeEntityClass
    {        
        public System.DateTime CreateDate { get; set; }
    }

}

部分课程:

public partial class SomeEntityClass : ICreateDate { }

代码异常:

private void SomeMethod()
{
    using (ProjectModel pm = new ProjectModel())
    {
        IQueryable<ICreateDate> qry = pm.SomeEntityClass.AsQueryable().Cast<ICreateDate>();
        qry = DateFilter(qry);
    }
}

private IQueryable<ICreateDate> DateFilter(IQueryable<ICreateDate> queryable)
{
    queryable = queryable.Where(q => q.CreateDate >= SomeRandomDate1 && q.CreateDate <= SomeRandomDate2);

    return queryable.OrderByDescending(q => q.CreateDate);
}

通过IQueryable<SomeEntityClass>传递失败的尝试时,异常消息:

  

无法将类型“Project.Entity.SomeEntityClass”强制转换为类型   'Project.Entity.ICreateDate'。 LINQ to Entities仅支持转换EDM   原始或枚举类型。

由于 LINQ to Entities仅支持转换EDM原语或枚举类型是反射我唯一的选择吗?

注意:我尝试使用通用方法方法 Erik Philips suggested但发生了同样的确切错误 编辑:我发现实体框架版本为4.4,我认为EF 5.0已添加到.NET 4.0项目中

2 个答案:

答案 0 :(得分:2)

  

由于LINQ to Entities仅支持转换EDM原语或枚举类型是反射我唯一的选择吗?

没有。数据库类是部分类,因此您可以定义接口:

public interface ICreateDate
{
  DateTime CreateDate { get; set; }
}

让EF通过代码生成创建一个实体对象,它应该如下所示:

// MyObject.cs
public partial MyObject
{
  public DateTime CreateDate { get; set; }
}

创建自己的分部类:

// MyObjectPartial.cs
public partial MyObject : ICreateDate
{
}

然后使用where子句创建一个泛型方法:

public IQueryable<T> DateFilter<T>(IQueryable<T> queryable) 
  where T : ICreateDate
{ 
  //code
}

答案 1 :(得分:1)

我个人有一个EntityBase类,通常包含IdCreatedOn

然后,处理实体的所有方法都可以访问这些属性(或者如果您使用的方法适用于任何实体,只需转换为Method<EntityBase>

public class EntityBase
{
    public DateTime CreatedOn { get; set; }
    public int Id { get; set; }
}


public class SomeEntity : EntityBase
{
    /*.....*/
}