2014-05-07 17 views
0

更新: 决定重写问题,因为它不是很清楚。EF代码第一个包装容器类没有定义密钥

如果我有类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] 

我有一种感觉,这是一个非常基本的问题,但我找不到任何地方的答案。我错过了什么让这项工作按需要?

回答

0

您可以将您的结束表定义为视图。如果你使用这种方法B就还需要定义键,然后创建一个实体像一个观点:

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); 

在我使用的1个

+0

感谢您的响应借助于上述示例。我从一个NHibernate项目转换而来,这个项目能够在没有你建议的方法的情况下使用,只使用原始实体。这仅仅是EF6的限制吗?我一直没有成功地确定NH的设置是否可以正常工作,但是我会继续研究如果解决方案能够解决EF6中的问题。这是一个大型项目,我不希望将它全部转换为您的建议方法! – DBHC

+0

我听到你在说什么,但是你正在描述的概念 - “结束表”是一个数据库视图 - 并首先使用ef代码我正在查看一个wAy来构建视图 – ozidom

+0

我想将来自B的数据存储在它自己的表并获得关键参考将是转换此项目最不具破坏性的方式。我只是感到惊讶,没有更清洁的解决方案,因为它是一个相对常见的情况 - 实际上,它意味着如果我想将某些数据封装到另一个类中,只有当新类没有引用另一个类时才能这样做...除非我愿意创建一个新表来存储它。 我会将这个问题公开一周,因为我真的很想知道是否有其他方法。 – DBHC

相关问题