Entity framework 4 首先在EF代码中设置类似外键的引用
我有一组四个POCO对象,它们需要以这种方式引用自身: 一个自由职业者可以有多个客户 客户端可以有多个项目 项目可以有多个故事 我想确定的一点是,自由职业者一开始没有客户,客户一开始没有项目,项目一开始就没有故事,所以我想他们需要为空 反之亦然,故事需要一个项目,项目需要一个客户,客户需要一个自由职业者 我只是想看看在创建模型(onModelCreating override)时是否需要做些什么,以确保这就是发生的关系 以下是我的物品:Entity framework 4 首先在EF代码中设置类似外键的引用,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,我有一组四个POCO对象,它们需要以这种方式引用自身: 一个自由职业者可以有多个客户 客户端可以有多个项目 项目可以有多个故事 我想确定的一点是,自由职业者一开始没有客户,客户一开始没有项目,项目一开始就没有故事,所以我想他们需要为空 反之亦然,故事需要一个项目,项目需要一个客户,客户需要一个自由职业者 我只是想看看在创建模型(onModelCreating override)时是否需要做些什么,以确保这就是发生的关系 以下是我的物品: public class Freelancer {
public class Freelancer
{
public int ID { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string CompanyName { get; set; }
public string Avatar { get; set; }
public Address FreelancerAddress { get; set; }
public ICollection<Client> Clients { get; set; }
}
public class Client
{
public int ID { get; set; }
public string Name { get; set; }
public Address ClientAddress { get; set; }
public string Logo { get; set; }
public ICollection<Project> Projects { get; set; }
}
public class Project
{
public int ID { get; set; }
public string Name { get; set; }
public string Summary { get; set; }
public string Description { get; set; }
public ICollection<Story> Stories { get; set; }
}
public class Story
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public decimal Duration { get; set; }
public bool Billable { get; set; }
public string Notes { get; set; }
}
公共职业自由职业者
{
公共int ID{get;set;}
公共字符串电子邮件{get;set;}
公共字符串密码{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串CompanyName{get;set;}
公共字符串Avatar{get;set;}
公共广播{get;set;}
公共ICollection客户端{get;set;}
}
公共类客户端
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共地址客户端地址{get;set;}
公共字符串标志{get;set;}
公共ICollection项目{get;set;}
}
公共类项目
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串摘要{get;set;}
公共字符串说明{get;set;}
公共ICollection故事{get;set;}
}
公开课故事
{
公共int ID{get;set;}
公共字符串标题{get;set;}
公共日期时间开始{get;set;}
公共日期时间结束{get;set;}
公共十进制持续时间{get;set;}
公共布尔可计费{get;set;}
公共字符串注释{get;set;}
}
我知道EF会自动做一些事情,我只是问我是否需要做更多的事情来确保我拥有我想要的关系。谢谢按照惯例,您的模型将创建可选关系(“客户可以有自由职业者,但不需要”),但由于您需要所需的关系(“客户需要自由职业者”),您必须使用Fluent API进行定义:
modelBuilder.Entity<Freelancer>()
.HasMany(f => f.Clients)
.WithRequired()
.Map(m => m.MapKey("FreelancerID")); // FK column name in Clients table
有了这样一个模型,EF将自动识别所需的关系,因为外键属性
freegorrid
不可为空,并且您不需要使用Fluent API进行额外的映射。按照惯例,您的模型将创建可选关系(“客户可以有一个自由职业者,但不需要”)但是,由于您需要所需的关系(“客户需要自由职业者”),您必须使用Fluent API定义它:
modelBuilder.Entity<Freelancer>()
.HasMany(f => f.Clients)
.WithRequired()
.Map(m => m.MapKey("FreelancerID")); // FK column name in Clients table
有了这样一个模型,EF将自动识别所需的关系,因为外键属性
freegorid
不可为空,并且您不需要使用Fluent API进行额外的映射。喜欢最后一部分,只需要一个说明。如果我有一个客户,有一个自由职业者,然后有一个名为freegorerid的属性,EF将识别为没有任何显式设置的FK?@davidesawesome:是的,因为约定:如果有一个名为XYZ(freegorer
)的导航引用指向ABC类(freegorer
)具有密钥属性DEF(ID
)和与目标类中的密钥属性具有相同类型的标量属性(int
),以及由导航属性的名称和目标类的密钥属性组成的名称(自由职业者
+ID
=自由职业者
)然后,该标量属性被视为表示外键。(唷!)如果您想将名称更改为例如freegorecode
,您需要注释或流畅的API。非常好的解释。非常感谢你喜欢最后一部分,只是一个澄清。如果我有一个客户,有一个自由职业者,然后有一个名为freegorerid的属性,EF将识别为没有任何显式设置的FK?@davidesawesome:是的,因为约定:如果有一个名为XYZ(freegorer
)的导航引用指向ABC类(freegorer
)具有密钥属性DEF(ID
)和与目标类中的密钥属性具有相同类型的标量属性(int
),以及由导航属性的名称和目标类的密钥属性组成的名称(自由职业者
+ID
=自由职业者
)然后,该标量属性被视为表示外键。(唷!)如果您想将名称更改为例如freegorecode
,您需要注释或流畅的API。非常好的解释。非常感谢你