与关系的EF4异常

时间:2011-10-12 23:26:52

标签: c# .net linq entity-framework

我有两个实体并且有他们的POCO:

public class DocumentColumn
{
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
    public virtual long? DocumentTypeId { get; set; }
}

public class DocumentType {
    public virtual long Id { get; set; }
    public virtual string Name { get; set; }
}

这两个实体之间存在关联。在db中,关系称为:FK_T_DOCUMENT_COLUMN_T_DOCUMENT_TYPE

当我这样做时:

DocumentColumns.Where(x => x.DocumentTypeId == documentTypeId).ToList();

我得到例外:

{"Metadata information for the relationship 'MyModel.FK_T_DOCUMENT_COLUMN_T_DOCUMENT_TYPE' could not be retrieved. If mapping attributes are used, make sure that the EdmRelationshipAttribute for the relationship has been defined in the assembly.  When using convention-based mapping, metadata information for relationships between detached entities cannot be determined.\r\nParameter name: relationshipName"}

我尝试删除关系和DocumentColumn表并重新加载它们但代码仍然抛出异常。

这个例外意味着什么,我该如何解决呢?

修改
如果我DocumentColumns.ToList();

,也会发生异常

2 个答案:

答案 0 :(得分:2)

(假设您正在谈论Code First ....) 任何一个类都没有信息让CF知道它们之间存在关系。数据库有信息并不重要。实体框架需要有关于这种关系的线索。您只提供带整数的属性。 CF无法推断出一种关系。您必须在一个类或另一个类中提供类型或其他类型的内容。这不是数据库。这是一个数据模型。非常不同的事情。

但这不是全部。我猜这是一对多的关系。您可以将List属性放入Document类或DocumentColumn类中的Document属性。如果执行后者,CF和EF将不知道1:。它将假设1:1(即如果你在其中留下DocumentId整数,否则它将假设1:0..1)。但是,我认为你可以逃避这一点,然后在流畅的API中配置多重性(1:)。

更新...再次阅读您的问题,我认为您使用的是EDMX而设计师不是第一个代码。你用什么来创建POCO课程?你是从EDMX做代码生成还是只是编写类。我仍然认为至少有一种类型缺少导航属性可能是导致问题的原因。 ERROR消息并不表示......我只是通过查看类并推断我对EF如何与元数据一起工作的理解来得出这个结论。我可能会咆哮错误的树。 FWIW,我已经向团队询问他们是否熟悉这个例外,并且可以提供一些关于创建它的模式的概念。这很奇怪。 :)

答案 1 :(得分:1)

对我而言,您使用具有已定义关系的EF并且您没有使用相关属性,这似乎很奇怪。你不能这样做:

DocumentColumns.Where(x=>x.DocumentType.Id == documentTypeId).ToList();

这是我期望在这个例子中看到的。