我有以下表结构:
public class Product
{
public string Id { get; set; }
public Knowledge Knowledge { get; set; }
}
public class Knowledge
{
public string Id { get; set; }
}
我希望Product
和Knowledge
之间的关系为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
答案 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 :(得分:0)
我开始认为这种弱关系实际上没有任何意义 - 它并没有真正强制执行任何东西,实际上没有任何好处。所以我最终完全删除了这种关系,因为我总是可以使用Product
或Knowledge
的PK获得其他部分。