我有一组需要以这种方式引用自己的四个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会自动完成一些事情,我只是在问我是否还需要做更多事情以确保我有我想要的关系。感谢
答案 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进行其他映射。