使用Code First搜索Entity Framework域模型

时间:2012-08-07 10:40:57

标签: entity-framework reflection entity-framework-4.1 ef-code-first fluentvalidation

有一个非常困难的EntityFramework Code First问题。我会尽可能简单地保持这个。

想象一下,我们有n个类,让我们从2开始

public class Person  
{   
    public string Name { get; set; }  
}



public class Address   
{  
    public string AddressLine1 { get; set; }  
    public string AddressLine2 { get; set; }  
}

现在,我想要做的是能够使用单个字符串搜索域模型,例如DbContext.Search(“Foo”)。该调用将在person和address表中搜索字符串匹配,并返回填充了Person和Address实体的列表。

不得不说我不完全清楚如何去做但我正在考虑使用DataAnnotations来做这样的事情

public class Person  
{  
    **[Searchable]**  
    public string Name { get; set; }  
}



public class Address   
{  
    **[Searchable]**  
    public string AddressLine1 { get; set; }  
    **[Searchable]**  
    public string AddressLine2 { get; set; }  
}  

我是否在正确的轨道上? 我应该使用Fluent API吗? 反射?

任何和所有的想法都受到了广泛的赞赏。

2 个答案:

答案 0 :(得分:0)

Find方法仅在主键列中搜索。如果我们不使任何列显式主键列,则find方法将抛出错误。通常,EF约定将propertyName + id作为类中的主键。但是如果你想用Name搜索,那么Make添加[Key]到属性。它将成为主键,你将能够找到属性。 dbContext.Addresses.find( “富”);

答案 1 :(得分:0)

创建一个新的对象类型,您将在其上投影两种类型的搜索结果:

public class Result
{
    public string MainField { get; set; } 
    // you may have other properties in here.
}

然后找到符合条件的每种类型的实体,将它们投射到此类型上:

var personResults = DbContext.Persons
      .Where(p => p.Name == "Foo")
      .Select(p => new Result{MainField = p.Name}); 
      // don't forget to map to any other properties you have in Result as well


var addressResults = DbContext.Adresses
     .Where(a => 
        a.AddressLine1 == "Foo" ||  
        a.AddressLine2 == "Foo"
     ).
     .Select(a => new Result{MainField = a.AddressLine1 + ", " + a.AddressLine2 });
     // again, don't forget to map to any other properties in Result 

然后合并列表:

var allResults = personResults.Union(addressResults).ToList();

...此时您可以根据自己的喜好对列表进行排序。

“结果”和“MainField”相当通用;只是使用它们,因为我并不完全了解您的域模型。