无法将位置转换为ILocation

时间:2016-10-30 23:08:21

标签: c# asp.net-mvc-5 entity-framework-6 ef-database-first

我得到一个相当奇怪的投射错误。这是代码:

public class OrganizationLocation : IOrganizationLocation
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public interface IOrganizationLocation
{
    string Name { get; }
}

public class Organization : IOrganization
{
    public Guid Id { get; set; }
    public string Alias { get; set; }

    public virtual ICollection<OrganizationLocation> Location { get; set; }

    public ICollection<IOrganizationLocation> Locations
    {
        get
        {
            return (ICollection<IOrganizationLocation>) Location;
        }
    }
}

public interface IOrganization
{
    string Alias { get; }
    ICollection<IOrganizationLocation> Locations { get; }
}

现在当我尝试通过服务运行它(后端数据层是EF6)时,“Location”变量具有所有值,但是,“Locations”变量无法转换。如果我尝试进行安全演员,每次都会返回null。

我不明白为什么演员会失败?它有相同的字段,都是ICollection类型,为什么我得到一个HashSet?

我这样做的原因是因为EF6框架能够将这个类视为一个表,它需要具有一个具体的类型和一个公共的get / set。但是,我不希望公开它,所以我使用接口,然后在调用接口时注入类。这样我只暴露get方法,并且在它之上我只暴露接口层。

  

无法将类型为'System.Collections.Generic.HashSet`1 [Namespace.OrganizationLocation]'的对象强制转换为'System.Collections.Generic.ICollection`1 [Namespace2.IOrganizationLocation]'。

1 个答案:

答案 0 :(得分:0)

我可以通过将代码更改为以下内容来解决此问题:

public class OrganizationLocation : IOrganizationLocation
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public interface IOrganizationLocation
{
    string Name { get; }
}

public class Organization : IOrganization
{
    public Guid Id { get; set; }
    public string Alias { get; set; }

    public virtual ICollection<OrganizationLocation> Location { get; set; }

    public IEnumerable<IOrganizationLocation> Locations => Location
}

public interface IOrganization
{
    string Alias { get; }
    IEnumerable<IOrganizationLocation> Locations { get; }
}