EF-CF-Set'忽略'来自另一个表值的属性

时间:2016-05-01 15:49:28

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

我正在使用Entity Framework Code-First方法。以下是我的样本模型。

    public class LocalizableEntity
    {
    public int Id{get;set;}

    // this property is 'Ignore'd. Need to set this.
    public string Name{get;set;}

    // this is the collection of 'Name's in all supported cultures.
    public virtual ICollection<LocalizationText> LocalNames{get;set;}
    }

使用流畅的API,将忽略“名称”属性,例如Ignore(t=>t.Name)。我的想法是通过查询给定的文化ID来从LocalNames集合中设置Name属性。 LocalizationText类型如下所示。

public class LocalizationText
{
public int Id{get;set;}
public string Text{get;set;}
public string Culture{get;set;}
}

我想实现在我的存储库中选择SINGLE,ALL和BY PREDICATE项目的方法(请考虑LocalizableEntitiesLocalizationText是DbSets),但是在一个查询中填充Name属性

获取单项项目

public LocalizableEntity GetById(int id)
{
var result=LocalizableEntities.Find(id); // selects the item

//the culture will be passed in by other way. Hard-coding here
result.Name=LocalizableEntities.LocalNames.Single(t=>t.Culture=="en-us");
return result;
}

但是上面的实现将需要两次DB调用。我想把它变成一个查询/表达式。我还需要在批量选择时执行此操作,为序列分配Name的值。

单个查询是否可以实现?如果是的话,有人可以指导我吗? 谢谢:))

1 个答案:

答案 0 :(得分:0)

忽略实体模型字段的气味。您的设计似乎非常适合ViewModel。那么假设您有一个名为LocalizationText的实体模型和一个名为LocalizableEntityVM的ViewModel,您可以执行以下操作:

public LocalizableEntityVM GetById(int id, string culture)
{
    var result=LocalizationText.Single(le => le.id && le.Culture == culture)
                  .Select(le => new LocalizableEntityVM 
                   {
                         Name = le.Text
                   });

    return result;
}