EF。如何在接口类型的属性上使用Include

时间:2014-08-29 09:16:02

标签: c# .net entity-framework

我在使用EF方面遇到了麻烦,并且不知道如何正确处理它。 我有2个数据库表:WebResource和UserGroup。我为他们制作了界面:

public interface IUserGroup
{
    int Id { get; set; }

    string Name { get; set; }

    string DisplayName { get; set; }
}

public interface IWebResource
{
    int Id { get; set; }

    int Group_Id { get; set; }

    IUserGroup Group { get; set; }
}

我还创建了一个接口IUsersRepository,它允许我访问我的数据库对象。

public interface IUsersRepository
{
    List<IUserGroup> UserGroups { get; set; }
    List<IWebResource> Controllers { get; set; }

    //TODO a little bit incorrect method
    List<IWebResource> GetUserResources(string username);

    List<IWebResource> GetResourcesByRole(string roleName);

    List<IWebResource> GetResourcesByController(string controllerName);
}

然后我做了2个实现:Ado.Net实现,对这个问题和EF实现没什么兴趣,看起来像这样:

public class UserGroup:IUserGroup
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [StringLength(50)]
    public string Name { get; set; }

    [StringLength(50)]
    public string DisplayName { get; set; }
}

public class WebResource:IWebResource
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int Group_Id { get; set; }

    [ForeignKey("Group_Id")]
    public IUserGroup Group { get; set; }

}

在我的用户存储库中,我有一个方法:

public List<IWebResource> GetResourcesByController(string controllerName)
    {
        var items = this.Controllers.Include("Group")
            .Where(c => c.ResourcePath == controllerName).ToList();
        var controllerGroups = new List<IWebResource>(items);
        return controllerGroups;
    }

这不起作用。我得到了一个例外&#34;在WebResource&#34;中找不到导航属性组。然后我尝试了这个:

public class WebResource:IWebResource
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public int Group_Id { get; set; }

    public IUserGroup Group
    {
        get { return EfGroup; }
        set { EfGroup = new UserGroup(); }
    }

    [ForeignKey("Group_Id")]
    public UserGroup EfGroup { get; set; }

}

并将Include(&#34; Group&#34;)更改为Include(&#34; EfGroup&#34;)。现在它很酷,但非常非常难看,我完全不喜欢它。我该如何正确实现?

0 个答案:

没有答案