Entity framework 4 首先在EF代码中设置类似外键的引用

Entity framework 4 首先在EF代码中设置类似外键的引用,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,我有一组四个POCO对象,它们需要以这种方式引用自身: 一个自由职业者可以有多个客户 客户端可以有多个项目 项目可以有多个故事 我想确定的一点是,自由职业者一开始没有客户,客户一开始没有项目,项目一开始就没有故事,所以我想他们需要为空 反之亦然,故事需要一个项目,项目需要一个客户,客户需要一个自由职业者 我只是想看看在创建模型(onModelCreating override)时是否需要做些什么,以确保这就是发生的关系 以下是我的物品: public class Freelancer {

我有一组四个POCO对象,它们需要以这种方式引用自身:

一个自由职业者可以有多个客户

客户端可以有多个项目

项目可以有多个故事

我想确定的一点是,自由职业者一开始没有客户,客户一开始没有项目,项目一开始就没有故事,所以我想他们需要为空

反之亦然,故事需要一个项目,项目需要一个客户,客户需要一个自由职业者

我只是想看看在创建模型(onModelCreating override)时是否需要做些什么,以确保这就是发生的关系

以下是我的物品:

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。非常好的解释。非常感谢你