我有两个实体并且有他们的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();
答案 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();
这是我期望在这个例子中看到的。