实体框架代码首先使用导航属性一键

时间:2015-02-20 21:21:21

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

我的实体框架Code First上下文中有以下类

public class DataBinding
{
    [Key]
    public DataSource Source
    { get; set; }

    [Key]
    public DataType Type
    { get; set; }
    .....
}

DataSourceDataType都是同一个上下文的一部分,但是当我尝试创建数据库时,我得到以下错误EntityType 'DataBinding' has no key defined. Define the key for this EntityType. DataBindings: EntityType: EntitySet 'DataBindings' is based on type 'DataBinding' that has no keys defined.我已经定义了两个键为什么我得到这个错误?

2 个答案:

答案 0 :(得分:2)

问题是您使用两种复杂类型作为PK,这是不允许的。 Key成员只能直接在实体中使用标量属性。复杂类型表示为不支持的复杂属性。 请检查此discussion和此post

要解决您的问题,您可以执行以下操作:

public class DataSource
{
    public int Id { get; set; }
    //...
}

public class DataType
{
    public int Id { get; set; }
    //...
}
public class DataBinding
{
    [Key,ForeignKey("Source"),Column(Order = 0)]
    public int DataSourceId {get;set;}
    [Key,ForeignKey("Type"),Column(Order = 1)]
    public int DataTypeId {get;set;}

   public DataSource Source { get; set; }

   public DataType Type { get; set; }
   //...
}

答案 1 :(得分:1)

完全重写:

如果我理解得很好,你想要在同一个上下文中实现具有基于外键的复合键的实体。 您无法直接链接实体,但可以按照示例链接此实体的主键。

composite key from foreign keys

在这种情况下,您必须明确地写出要在类中引入的(简单类型)中的外键实体的主键,如前面的示例所示,然后添加导航属性。

当您构建复合键(在任何情况下)时,您必须对键进行排序。