首先在EF代码中设置外键,如引用

时间:2012-09-23 17:10:09

标签: entity-framework-4 ef-code-first

我有一组需要以这种方式引用自己的四个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; }
}

我理解EF会自动完成一些事情,我只是在问我是否还需要做更多事情以确保我有我想要的关系。感谢

1 个答案:

答案 0 :(得分:1)

按照惯例,您的模型将创建可选关系(“client 可以拥有自由职业者,但不需要”)但是因为您需要所需的关系(“client < em>需要自由职业者“)你必须用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进行其他映射。