实体框架 - 包括ComplexType

时间:2017-12-21 07:22:02

标签: c#

我在EF Core 2.0中有一个实体类:

public class Component : BaseModel
{
    [Required]
    public string Name { get; set}
    public virtual ICollection<ComponentInstance> ComponentInstances { get; set; }
    public virtual Title Title {get ; set;}
}

和另一个ComplexType类:

[ComplexType]
public class Title
{
    public string Text { get; set; }
    public string Color { get; set; }
    public string BackgroundColor { get; set; }
}

运行此代码:

var component = _dbContext.Company
                          .Where(x => x.Id == componentId)
                          .Include(x => x.Title)
                          .FirstOrDefault();

抛出异常:

  

该物业&#39; Title&#39;不是实体类型的组件&#39;的导航属性。 &#39;包含(字符串)&#39;方法只能用于&#39;。&#39;分隔的导航属性名称列表。

2 个答案:

答案 0 :(得分:0)

如果您仍在努力,则需要向您的班级[ForeignKey("")]加注。 像这样:

public class Component : BaseModel
    {

        [Required]
        public string Name { get; set}
        public virtual ICollection<ComponentInstance> ComponentInstances { get; set; }
        [ForeignKey("Title")]
        public Title Title {get ; set;}
    }

答案 1 :(得分:0)

最可能的问题是,在Component班级中,Title属性未标记为virtual

如果不是virtual实体框架不能override它,那么它将忽略它,并且不会将它视为具有上下文的实体。

现在,即使您将其标记为虚拟,它仍然不一定意味着实体框架会将其识别为实体,因此在这种情况下,您需要指定与Entity Framework's Fluent API的关系

如果组件类的关系对于实体框架是明确的,基于Convention over Configuration,则没有必要明确说明与流畅API的关系。

您显然还需要在您的类中拥有继承自DbSet<Component>

DbSet<Title>DbContext属性