1

我有一组需要以这种方式引用自己的四个 POCO 对象:

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

客户可以有多个项目

项目可以有多个故事。

我想确保的一个可能是自由职业者开始时没有客户,客户开始时没有项目,项目开始时没有故事,所以我想他们需要可以为空?

另一个方向则相反,一个故事需要一个项目,一个项目需要一个客户,一个客户需要一个自由职业者。

我只是想看看在创建模型(onModelCreating 覆盖)时是否需要做任何事情,以确保这是发生的关系。

这是我的对象:

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; }
}

我知道 EF 会自动做一些事情,我只是想问我是否需要做更多的事情来确保我拥有我想要的关系。谢谢

4

1 回答 1

1

按照惯例,您的模型将创建可选关系(“客户可以有一个自由职业者,但不需要”),但由于您需要必需的关系(“客户需要一个自由职业者”),您必须使用 Fluent API 定义它:

modelBuilder.Entity<Freelancer>()
    .HasMany(f => f.Clients)
    .WithRequired()
    .Map(m => m.MapKey("FreelancerID"));  // FK column name in Clients table

您可以在没有最后一行 ( Map) 的情况下工作。然后 EF 将创建一个默认外键名称,带有下划线的名称,也许是Freelancer_ID.

其他关系的映射相同。

或者,您可以使用外键属性引入反向导航属性:

public class Client
{
    public int ID { get; set; }
    //...
    public ICollection<Project> Projects { get; set; }

    public int FreelancerID { get; set; }
    public Freelancer Freelancer { get; set; }
}

使用这样的模型,EF 将根据需要自动识别关系,因为外键属性FreelancerID不可为空,并且您不需要使用 Fluent API 进行额外映射。

于 2012-09-23T17:27:13.077 回答