EFv1映射1到许多与POCO的关系

时间:2010-06-09 20:27:50

标签: c# entity-framework .net-3.5 poco dto

我正在尝试解决一个问题,即我将EF实体映射到POCO,作为DTO。

我的数据库中有两个表,比如产品和类别。产品属于一个类别,一个类别可能包含许多产品。我的EF实体名为efProduct和efCategory。在每个实体中,efProduct和efCategory之间存在适当的导航属性。

我的Poco对象很简单

public class Product
{
    public string Name { get; set; }
    public int ID { get; set; }
    public double Price { get; set; }
    public Category ProductType { get; set; }
}

public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<Product> products { get; set; }
}

要获取产品列表,我可以执行类似

的操作
    public IQueryable<Product> GetProducts()
    {
        return from p in ctx.Products
               select new Product
               {
                   ID = p.ID,
                   Name = p.Name,
                   Price = p.Price
                   ProductType = p.Category
               };
    }

但是存在类型不匹配错误,因为p.Category属于efCategory类型。我该如何解决这个问题?也就是说,如何将p.Category转换为Category?

同样在我做的时候

        return from c in ctx.Categories
                where c.ID == id
                select new Category
                {
                    ID = c.ID,
                    Name = c.Name,
                    ProductList = c.Products;
                };

我得到一个不匹配,因为ProductList是Product类型,其中c.Products是一个EntityCollection

我知道在.NET中,EF增加了对POCO的支持,但我不得不使用.NET 3.5 SP1。

1 个答案:

答案 0 :(得分:4)

    return from p in ctx.Products
           select new Product
           {
               ID = p.ID,
               Name = p.Name,
               Price = p.Price
               ProductType = new Category
               {
                   ID = p.Category.ID,
                   Name = p.Category.Name // etc.
               }
           };

对于Category,您可以:

    return from c in ctx.Categories
            where c.ID == id
            select new Category
            {
                ID = c.ID,
                Name = c.Name,
                ProductList = from p in c.Products
                              select new Product
                              {
                                  ID = p.ID,
                                  Name = p.Name,
                                  Price = p.Price
                              }
            };