EF6 Code第一个具有自定义关联的导航属性

时间:2014-05-21 18:41:00

标签: c# entity-framework ef-code-first

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

以上是否有意义?

1 个答案:

答案 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扩展方法来解决,但它当前不存在。