我有2个类(class):客户和调查。

每个客户可以有许多调查-但只能有一个默认调查。

我已经定义了这样的类:

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

    public string ClientName { get; set; }

    public Nullable<int> DefaultSurveyID { get; set; }

    [ForeignKey("DefaultSurveyID")]
    public virtual Survey DefaultSurvey { get; set; }

    public virtual ICollection<Survey> Surveys { get; set; }
}

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

    public string SurveyName { get; set; }

    [Required]
    public int ClientID { get; set; }

    [ForeignKey("ClientID")]
    public virtual Client Client { get; set; }
}

如我所料,这将创建Client表:
[dbo].[Clients]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[ClientName] [nvarchar](max) NULL,
[DefaultSurveyID] [int] NULL
)

但是Survey表有一个额外的外键:
[dbo].[Surveys]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[SurveyName] [nvarchar](max) NULL,
[ClientID] [int] NOT NULL,
[Client_ID] [int] NULL
)

为什么“代码优先”会产生这种关系,如何告诉我不这样做呢?

最佳答案

问题是,当您在两个实体之间具有多个关系时,EF Code First无法找出匹配的导航属性,除非您告诉它如何,这是代码:

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

    public string ClientName { get; set; }

    /****Change Nullable<int> by int?, looks better****/
    public int? DefaultSurveyID { get; set; }

    /****You need to add this attribute****/
    [InverseProperty("ID")]
    [ForeignKey("DefaultSurveyID")]
    public virtual Survey DefaultSurvey { get; set; }

    public virtual ICollection<Survey> Surveys { get; set; }
}

在您以前的版本中,EF正在创建该额外的关系,因为它不知道DefaultSurvey属性引用了ID类的Survey,但是您可以让它知道,添加属性InverseProperty,其参数是该属性的名称在Survey中,您需要DefaultSurvey与之匹配。

关于entity-framework - 首先, Entity Framework 代码:如何为 “Default”值注释外键?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15483019/

10-12 19:56