Entity Framework 6 定义一个真正可选的外键

Entity Framework 6 define a REALLY optional foreign key

假设我有两个 tables:

Products
[ProductID] PK
[Weight]
[ProductCode]

KnownProductCodes
[ProductCode] PK
[Description]

现在我希望我的 Product 实体有一个 KnownProductCodeDetails 属性。但有趣的是 Products.ProductCode 可能包含 KnownProductCodes table 中确实存在的产品代码,或者 KnownProductCodes [=] 中不存在的产品代码34=].

所以,我的问题是:如何在 Entity Framework 中的两个实体之间建立这种关系?

PS。顺便说一下,一个实体是否可以在数据库中没有相应的约束条件的情况下拥有外国关系?

谢谢!

== 详细信息:EF 6.1.2,代码优先

这样的关联不会是外键。

FK 是一个约束,它使用实体的主键值来限制引用实体中值的域。但是,您不希望值 Product.ProductCode 受到约束,因此根据定义,该字段不能是外键。 (技术上也不是)。

第二点是,像 KnownProductCodes.ProductCode 这样有意义的主键几乎总是一个坏主意,因为有一天业务可能会要求更改它们的值。而且更改主键值很麻烦。

因此 这里显而易见的事情 是为新的主键字段 KnownProductCodesId 创建一个真正的可为 null 的外键。然后您可以从此 FK(如果不为空)或 Product.ProductCode 获取产品产品代码的显示值。现在修改 KnownProductCodes.ProductCode 很容易。

另一种方法 可能是创建一个 "free association"。让这成为你的 类:

public class Product
{
    public int ProductID { get; set; }
    public decimal? Weight { get; set; }
    public string ProductCode { get; set; }
    public virtual KnownProductCode KnownProductCode { get; set; }
}

public partial class KnownProductCode
{
    public string ProductCode { get; set; }
    public string Description { get; set; }
}

现在您可以在映射中定义它们之间的关联:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<KnownProductCode>().HasKey(k => k.ProductCode);
    modelBuilder.Entity<Product>()
        .HasOptional(p => p.KnownProductCode)
        .WithMany()
        .HasForeignKey(p => p.ProductCode);
}

但是在数据库中您避免创建实际的 FK。 EF 将允许这样做,它只希望关联指向实体的主键,但关联不必是数据库中的硬 FK。

(但请注意,如果您从模型创建数据库,这会采取特殊措施,我不推荐这样做)。