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的内置约定的内容,但是我只能找到使用特定主键的解决方案。

上面的内容有意义吗?

EF6代码第一导航属性与自定义关联

嗯,我可以看到为什么你想这样做,但目前你唯一的选择是使用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扩展方法来解决,但是目前还不存在。