我有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/