EF代码第一个包装容器类没有定义键

时间:2014-05-07 14:32:18

标签: ef-code-first entity-framework-6

更新 决定重写这个问题,因为它不是很清楚。

如果我有A类并且给它一个无键类B的引用,而不是B类变成它自己的表,它的所有列都将显示在A类的表上 - 这就是我想要的。 但现在我希望B持有对C类的引用,C类有自己的表和键。我现在期望的是,表A显示B的属性以及保存C键的列。但是当我添加此引用时,它告诉我B没有定义键,因此它不起作用。

public class A
{
    [Key]
    public virtual int AId { get; set; }
    public virtual B b{ get; set; }
}

public class B
{
    public bool Fixed { get; set; }
    public virtual C c{ get; set; }
}

public class C
{
    [Key]
    public virtual int CId { get; set; }
}

结束表的外观示例:

  [AId]
      ,[Fixed]
      ,[CId]
      FROM [A]

我有一种感觉这是一个非常基本的问题,但我无法在任何地方找到答案。我想要做什么工作?

1 个答案:

答案 0 :(得分:0)

您可以将结束表定义为视图。如果采用这种方法,B还需要Key定义,然后为视图创建一个实体,如:

public class ABCView
{
    public virtual int AId { get; set; }
    public bool Fixed { get; set; }
    public virtual int CId { get; set; }
} 

您需要创建如下视图:

string script =
@"
CREATE VIEW dbo.ABCView
AS SELECT a.AId,b.Fixed,c.CId
FROM dbo.a a
LEFT JOIN dbo.b b ON a.b_BId = b.BId
LEFT JOIN dbo.c c ON b.c_CId = c.CId";

db.Database.ExecuteSqlCommand(script);

然后加载视图,如:

var abcItem = db.Database.SqlQuery<ABCView>("Select * from    dbo.ABCView").FirstOrDefault(abc => abc.AId == 1);

在上面的示例中,我使用的是AId 1