使用继承时,多对多导航属性为null

时间:2015-09-15 15:12:21

标签: c# asp.net-mvc entity-framework

我正在使用C#/ MVC继承。我有一个父类Parent,具有各种属性,还有一个子Child,它继承自Parent并为多对多关系添加属性。我刚才在其他地方读过,使用继承正确处理这个需要一个重写的方法来返回Child的属性,所以我试图这样做(因为C#不会识别Child的属性因此不能直接查询它。)

但是,该方法始终返回null,父类型的实际导航属性也是null。我对这种方法和/或映射做错了什么?

Parent

public class Parent
{
    public virtual int Id { get; set; }
    // other irrelevant properties

    public virtual ICollection<Property> GetChildProps()
    {
        // meant to be overridden by Child
        return null;
    }

    public virtual void SetChildProps(ICollection<Property> props)
    {
        // meant to be overridden by Child
    }
}

Child

public class Child : Parent
{
    public ICollection<Property> Properties { get; set; }

    public override ICollection<Property> GetChildProps()
    {
        return Properties;
    }

    public override void SetChildProps(ICollection<Property> props)
    {
        Properties = props;
    }
}

EF Mapping。大多数映射都是在父类映射中完成的(使用EF TPH),但此关系在此处进行映射。值 正确存储在数据库中。

public ChildTaskMap()
    {
        HasMany(s => s.Properties)
            .WithMany(o => o.Children)
            .Map(m =>
            {
                m.ToTable("Child_Properties");
                m.MapLeftKey("ChildId");
                m.MapRightKey("PropertyId");
            });
    }

这是我调用GetChildProps()的一次(总是返回null):

Parent p = _parentService.GetParentById(id);
var cProps = p.GetChildProps();

GetParentById()的代码:

public Project GetById(int id)
{
    return _parentRepository.GetById(id);
}

// then

public T GetById(object id)
{
    return this.Entities.Find(id);
}

// Entities is

private IDbSet<T> Entities
{
    get
    {
        if (_entities == null)
            _entities = _context.Set<T>();
            // _entities is an IDbSet<T>
        return _entities;
    }
}

0 个答案:

没有答案