我想首先使用EF代码来处理不基于密钥而是基于实体的某个属性值的自定义关联(或导航属性)。
我的课程是这些
public class MyConfig
{
public int Id { get; set; }
public int InstanceNumber { get; set; }
public bool IsValid { get; set; }
public int Code { get; set; }
}
public class MyAsset
{
public int Id { get; set; }
public string Name { get; set; }
public List<MyConfig> MyConfigs { get; set; }
public int InstanceValue { get; set; }
}
所以我想在任何MyAsset实体上收集MyConfig实体。当从数据库加载MyAsset实体时,我希望它包含一个MyConfig实体列表,其实例“InstanceNumber”中的值与MyAsset实体的InstanceValue匹配。
我可以使用EF6 codefirst吗?我已经阅读了覆盖EF的内置约定,但我只能找到适用于特定主键的解决方案。
以上是否有意义?
答案 0 :(得分:1)
好吧,我可以看到为什么你想这样做,但目前你唯一的选择是使用Include扩展方法并获取所有MyConfig实例,然后你需要在你查询的MyAsset实例中过滤MyConfig实例列表,如下所示:
public class MyAssetRepository : IMyAssetRepository
{
public MyAsset Get(int assetId)
{
using (var context = new AssetContext())
{
var selectedAsset = context.MyAssets.Include(a => a.MyConfigs).Single(a => a.Id == assetId);
selectedAsset.MyConfigs = selectedAsset.MyConfigs
.Where(c => c.InstanceNumber == selectedAsset.InstanceValue)
.ToList();
return selectedAsset;
}
}
}
在此示例中,将MyAsset实例封装在存储库中,以便将MyAsset实例及其MyConfig实体的逻辑封装在存储库外部的代码中。
当然,获取所有MyConfig实体的开销将存在,可以通过使用接受过滤器参数的Include扩展方法来解决,但它当前不存在。