EF外键不是ID

时间:2014-04-10 19:08:20

标签: c# entity-framework ef-code-first foreign-keys code-first

有没有办法让EF将外键映射到除第二个表的ID以外的其他内容。

例如;

public class Company
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public string sys_id { get; set; }
}

public class Ticket
{
    [Key]
    public int id { get; set; }
    public string company_id { get; set; }
    public string short_desc { get; set; }
}

上面的表保存从外部源引入的数据(这个位工作正常,并且能够查询数据库),因此我无法控制密钥。我遇到的问题是我需要将Ticket.company_id与Company.sys_id连接,而不是Company.id,以便我可以使用Ticket.company.name或Company.ticket.short_desc等。

有人可以告诉我如何实现这个目标吗?

编辑:我一直在环顾四周,发现InverseProperty属性用于将ForeignKey映射到除了另一个表的id之外的其他内容。

例如;

public class Company
{
    [Key]
    public int id { get; set; }
    public string name { get; set; }
    public string sys_id { get; set; }

    [InverseProperty("company_id")]
    [ForeignKey("sys_id")] 
    public virtual ICollection<Ticket> Tickets { get; set; }
}

public class Ticket
{
    [Key]
    public int id { get; set; }
    public string company_id { get; set; }
    public string short_desc { get; set; }

    public virtual Company Company { get; set; }
}

但是我收到错误“属性'company_id'不能配置为导航属性。该属性必须是有效的实体类型,属性应该具有非抽象的getter和setter。对于集合属性,类型必须实现ICollection其中T是有效的实体类型。“当我尝试添加迁移时。

提前致谢, 诺曼

1 个答案:

答案 0 :(得分:0)

您可以选择sys_id作为新密钥,并将id保留用于其他目的,例如:

public class Company
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }

    public string name { get; set; }

    [Key, StringLength(128)]
    public string sys_id { get; set; }
}

public class Ticket
{
    public int id { get; set; }

    public string short_desc { get; set; }

    public string company_id { get; set; }
    [ForeignKey("company_id"), StringLength(128)]
    public virtual Company Company { get; set; }
}

虽然我不推荐这个。