使用linq加载导航属性而不声明外键

时间:2015-10-23 16:34:34

标签: c# linq entity-framework-6

我所在的项目首先使用Entity Framework 6代码,并拥有中央数据库和本地数据库。中央数据库与本地数据库相同,但所有关系(外键,主键等)都已被删除。

让我们想象一下,我有以下几个类:

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public int ProductTypeId { get; set; }
    public ProductType ProductType { get; set; }
}

public class ProductType
{
    public int ProductTypeId { get; set; }
    public string Name { get; set; }
    public List<Product> Products { get; set; }
}

如果数据库在Product表中有外键我可以

IEnumerable<Product> products = ctx.Produts.Include(x => x.ProductType);

如果数据库没有外键,EF是否仍会使用上面的代码加载ProductType对象?

2 个答案:

答案 0 :(得分:0)

如果没有外键,EF将不会加载ProductType对象。

您需要执行新查询。像这样:

IEnumerable<Product> products = ctx.Produts;

foreach (var product in products )
{
   ProductType type = (from t in ctx.ProductType where t.ProductTypeId == product.ProductTypeId select t).Single();    
   product.ProductType = type;
}

答案 1 :(得分:0)

我很好奇这个,所以我嘲笑了一个快速测试,我用它运行,然后在数据库中没有外键。答案似乎是肯定的,如果您仍在实体框架中配置了密钥,它将起作用。但是请注意,当然,如果没有密钥,数据库显然不会强制执行参考约束,尽管它看起来像EF。