HasRequired和HasOptional有什么区别

时间:2011-09-15 12:14:24

标签: entity-framework-4.1

我有以下实体

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实体。

提前致谢。

1 个答案:

答案 0 :(得分:8)

基于HasRequired和HasOptional的含义,我希望Optional#1强制执行A​​ddress,并且不允许您在不指定地址的情况下创建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