EF6代码第一导航属性与自定义关联
本文关键字:自定义 关联 属性 导航 代码 EF6 | 更新日期: 2023-09-27 18:04:33
我想首先使用EF Code来处理一个自定义关联(或导航属性),它不是基于一个键,而是基于一个实体的属性值之一。
我的类是这些
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代码做到这一点吗?我已经阅读了关于重写EF的内置约定的内容,但是我只能找到使用特定主键的解决方案。
上面的内容有意义吗?
嗯,我可以看到为什么你想这样做,但目前你唯一的选择是使用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扩展方法来解决,但是目前还不存在。