簡體   English   中英

如何在實體框架4.4中定義公用列名

[英]How to define common column names in entity framework 4.4

結合使用Entity Framework 4.4和數據庫優先方法。 我在大多數表(例如CreateDate)中定義了一個公共column

我不想為每種類型編寫日期過濾查詢,並試圖避免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的 建議使用通用方法,但是發生了相同的確切錯誤編輯:我發現Entity Framework版本為4.4 ,我想將EF 5.0添加到.NET 4.0項目中

由於LINQ to Entities僅支持轉換EDM原語或枚舉類型,因此反射是我唯一的選擇?

否。數據庫類是Partial類,因此您可以定義一個接口:

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
}

我個人有一個EntityBase類,通常包含一個Id和一個CreatedOn

然后,您處理實體的所有方法都可以訪問這些屬性(或者,如果您使用的是可在任何實體上使用的方法,只需將其Method<EntityBase>Method<EntityBase>

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


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM