簡體   English   中英

如何使用實體框架數據庫首先自動生成的代碼中的接口

[英]How to use interface from entity framework database first auto-generated code

我首先使用數據庫使用實體框架自動生成以下兩個類;

public partial class UserXml
{
    public UserXml()
    {
        this.UserXmlHotel = new HashSet<UserXmlHotel>();
    }

    public long UserId { get; set; }
    public string Password { get; set; }
    public bool Enabled { get; set; }
    public byte FailedAttempt { get; set; }

    public virtual User User { get; set; }
    public virtual UserXmlIp UserXmlIp { get; set; }
    public virtual ICollection<UserXmlHotel> UserXmlHotel { get; set; }
}

public partial class UserCustomer 
{
    public UserCustomer ()
    {
        this.UserCustomerHotel = new HashSet<UserCustomerHotel >();
    }

    public long UserId { get; set; }
    public bool Enabled { get; set; }
    public string Password { get; set; }
}

然后,我創建了以下類;

public partial class UserXml : IUser
{
}

public partial class UserCustomer : IUser
{
}

public static class EntityExtensions
{
    public static IQueryable<T> Enabled<T>(this IQueryable<T> source) where T : IUser
    {
        return source.Where(x => x.Enabled);
    }
}

我有一個接口

public interface IUser
{
    bool Enabled { get; }
}

我想要做的是使用相同的可重用代碼為每個實體組合相同的調用; 所以拿

using(var Context = new EscapeEntities())
{
     bool bEnabled = Context.UserXml.First(u => u.UserId == iUserId).Enabled;
}

using(var Context = new EscapeEntities())
{
     bool bEnabled = Context.UserCustomer.First(u => u.UserId == iUserId).Enabled;
}

我想使用我的EntityExtensions類,但是我無法使其正常工作。 有指針嗎?

在實現接口的泛型類型上使用表達式時,表達式構建器將強制類型轉換添加到表達式中,如下所示:

x => x.Enabled // converts to something like below: 
x => ((IUser)x).Enabled

因此,您需要做的就是通過將泛型類型定義為一個類來告訴表達式生成器不要添加強制轉換表達式,這意味着您的Enabled(...)擴展方法必須像這樣:

public static IQueryable<T> Enabled<T>(this IQueryable<T> source) 
  where T : class, IUser // added 'class' constraint
{
    return source.Where(x => x.Enabled);
}

另一種方法(需要做更多的工作)是定義一個ExpressionVisitor類,以刪除對該表達式的轉換,對此stackoverflow Answer進行了說明

因此,在更正之后,您可以輕松使用擴展方法:

using(var Context = new EscapeEntities())
{
    IQueryable<UserXml> query = Context.UserXml
        .Where(u => u.Password == "Foo")).Enabled();
    List<UserXml> res = query.ToList();
}

PS:我認為最好使用另一個帶有兩個名為UserXmlUserCustomer子級的“基本” User表,並將公共列抽象到User表中,這樣就省去了額外的接口,並且還與面向對象設計兼容。

暫無
暫無

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

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