繁体   English   中英

带有自定义关联的EF6代码优先导航属性

[英]EF6 Code first navigation property with custom association

我想先使用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代码吗? 我已经阅读了有关覆盖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实例被封装在存储库中,因此获取具有MyConfig实体的MyAsset实例的逻辑被封装并从存储库外部的代码中隐藏。

当然,将出现获取所有MyConfig实体的开销,这可以通过使用接受过滤器参数的Include扩展方法来解决,但是当前不存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM