如何与"共享"创建0..1到0..1的关系PK?

时间:2014-05-18 07:01:21

标签: entity-framework ef-code-first

我有以下表结构:

public class Product
{
    public string Id { get; set; }
    public Knowledge Knowledge { get; set; }
}

public class Knowledge
{
    public string Id { get; set; }
}

我希望ProductKnowledge之间的关系为0..1-0..1,Knowledge.Id为PK和FK为Product。我关注this guide并使用此代码

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // see: http://blog.bennymichielsen.be/2011/06/02/entity-framework-4-1-one-to-one-mapping/
    modelBuilder.Entity<Product>()
        .HasRequired(e => e.Knowledge)
        .WithRequiredPrincipal();

    base.OnModelCreating(modelBuilder);
}

我得到1-0..1的关系。但我不希望Knowledge有FK约束,即我希望能够创建Knowledge而没有相应的Product。那可能吗?这是SQL Server方面的一个微不足道的修复,但我想这对EF的工作方式来说可能不自然。如果那不可能,那么我最好的选择是什么?

我使用的是EF 6.1

2 个答案:

答案 0 :(得分:1)

需要将产品配置为知识的可选项。更改MSDN Entity Framework Fluent API - Relationships页面中的代码以符合您的示例:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{    
    modelBuilder.Entity<Product>()
        .HasRequired(p => p.Knowledge)
        .WithOptional();

    base.OnModelBuilding(modelBuilder);
}

这给出了一个表结构,其中强制执行所需的可选关系,而Product上的主键也是Knowledge关系的ForeignKey。

使用以下结果快速测试(在DbContext.SaveChanges()确定成功或失败):

  1. 使用新知识创建和添加新产品(p)(成功)
  2. 单独创建和添加新知识(k') - 成功
  3. 创建和添加新产品(p')并分配知识(k') - 成功
  4. 创建和添加新产品(p'')并分配知识(k') - 成功 - 应注意p''在上下文中覆盖p',但p'仍然存在直到被处置。
  5. 创建和添加没有知识的新产品(p''') - 失败

答案 1 :(得分:0)

我开始认为这种弱关系实际上没有任何意义 - 它并没有真正强制执行任何东西,实际上没有任何好处。所以我最终完全删除了这种关系,因为我总是可以使用ProductKnowledge的PK获得其他部分。