如何建立适当的代码优先关系

本文关键字:代码 关系 何建立 建立 | 更新日期: 2023-09-27 18:01:29

我对实体框架相当陌生,使用代码优先模式而不是数据库优先模式更能控制。

我想知道当涉及到以编程方式在实体之间建立ForeignKey关系时,哪种方式更受欢迎。

在与另一个类相关的类中声明FK_属性是否更好,或者在与之相关的类中声明IEnumerable<>属性是否更好?

public class IRelateToAnotherClass
{
    ...
    public int FK_IGetRelatedToByAnotherClass_ID { get; set; }
}

public class IGetRelatedToByAnotherClass
{
    ...
    public IEnumerable<IRelateToAnotherClass> RelatedTo { get; set; }
}

如何建立适当的代码优先关系

这完全取决于实体之间的关系类型(一对一,一对多,多对多);但是,是的,您应该声明外键属性。看看这个网站上的一些例子。

这是两个类的一对多:

public class IRelateToAnotherClass
{
    public int Id { get; set; } // primary key
    public virtual ICollection<IGetRelatedToByAnotherClass> IGetRelatedToByAnotherClasses { get; set; }
}
public class IGetRelatedToByAnotherClass
{
    public int Id { get; set; } // primary key
    public int IRelateToAnotherClassId { get; set; } // foreign key
    public virtual IRelateToAnotherClass IRelateToAnotherClass { get; set; }
}

和一些Fluent API映射:

modelBuilder.Entity<IGetRelatedToByAnotherClass>.HasRequired<IRelateToAnotherClass>(p => p.IRelateToAnotherClass).WithMany(p => p.IGetRelatedToByAnotherClasses).HasForeignKey(p => p.Id);

如果我理解你问的是正确的,你会想要两者。你想要一个int FK属性和一个对象属性作为导航属性。

最终结果看起来像这样:

public class Employee
{
    [Key]
    public int EmployeeID { get; set; }
    [ForeignKey("Store")]
    public int StoreNumber { get; set; }
    // Navigation Properties
    public virtual Store Store { get; set; }
}
public class Store
{
    [Key]
    public int StoreNumber { get; set; }
    // Navigation Properties   
    public virtual List<Employee> Employees { get; set; }
}


如果你还没有,看看导航属性和延迟加载。请注意,EF足够聪明,可以计算出int StoreID属性对应于对象Store属性,但如果它们的命名不同(例如没有ID后缀),则必须使用[ForeignKey]注释。