我有以下实体
public class SchoolContext : DbContext
{
public DbSet<Address> Addresses { get; set; }
public DbSet<Employee> Employees { get; set; }
}
public class Address
{
public int Id { get; set; }
public string Street { get; set; }
public virtual Employee Employee { get; set; }
}
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Address Address { get; set; }
}
如果我使用以下Fluent API设置Employee和Address之间的关系
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Option #1
modelBuilder.Entity<Employee>()
.HasRequired(s => s.Address)
.WithRequiredPrincipal(a => a.Employee);
// Option #2
modelBuilder.Entity<Employee>()
.HasOptional(s => s.Address)
.WithRequired(a => a.Employee);
}
以上两个选项创建表结构完全相同,如果是这样,两个选项之间有什么不同。如果我使用选项#1,我认为Employee实体总是应该有地址实体,但事实并非如此。我能够保存没有地址值的Employee实体。
提前致谢。
答案 0 :(得分:8)
基于HasRequired和HasOptional的含义,我希望Optional#1强制执行Address,并且不允许您在不指定地址的情况下创建Employee,并且Option#2允许您创建具有可选地址。
HasRequired
从此实体类型配置所需的关系。实例 除非,实体类型将无法保存到数据库中 这种关系是指定的。数据库中的外键会 是不可空的。HasOptional
配置此实体的可选关系 类型。实体类型的实例将能够保存到 未指定此关系的数据库。外键在 数据库可以为空。http://msdn.microsoft.com/en-us/library/gg671317%28v=vs.103%29.aspx
http://msdn.microsoft.com/en-us/library/gg671230%28v=vs.103%29.aspx