将Generics与EF类一起使用

时间:2014-12-10 12:09:43

标签: c# entity-framework

我使用EF6和Code First,并且有几个表具有几乎相同的模式。我希望能够对这些表执行查询并将结果返回到公共对象(类),而不是为每个表创建一个新对象。

因此,例如,EF不允许:

public class Product1 {
    public int id { get; set; }
    public string name { get; set; }
}

public DbSet<Product1> Products1 { get; set; }
public DbSet<Product1> Products2 { get; set; }

所以我必须定义第二个POCO:

public class Product1 {
    public int id { get; set; }
    public string name { get; set; }
}

public class Product2 {
    public int id { get; set; }
    public string name { get; set; }
}

public DbSet<Product1> Products1 { get; set; }
public DbSet<Product2> Products2 { get; set; }

至少我希望能够将这些POCO的结果处理得相同,以便我可以将结果插入另一个类:

public class SomeClass {
    public <Product1 or Product2> Product { get; set; }
}

能够将db表中的结果存储在同一个对象中:

SomeClass someclass = new SomeClass();

someclass.Product = _context.Products1.Where(p => p.id == 1).First();

someclass.Product = _context.Products2.Where(p => p.id == 1).First();


int thisId = someclass.Product.id;

如何使someclass.Product通用,以便它接受Product1或Product2?

1 个答案:

答案 0 :(得分:1)

您必须使类从接口继承,然后在泛型类型约束中使用该接口。

public interface IProduct 
{
    int id { get; set; }
    string name { get; set; }
}

public class Product1 : IProduct
{
    public int id { get; set; }
    public string name { get; set; }
}

public class Product2 : IProduct
{
    public int id { get; set; }
    public string name { get; set; }
}

然后你可以按如下方式定义SomeClass:

public class SomeClass<TProduct> where TProduct : IProduct 
{
    public TProduct Product { get; set; }
}