如何建立适当的代码优先关系
本文关键字:代码 关系 何建立 建立 | 更新日期: 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]注释。