实体框架代码首先在连接表中映射复合键,其中外键未在模型中公开

时间:2012-01-30 00:10:09

标签: .net entity-framework many-to-many ef-code-first

我有一个连接表,其中包含与连接相关的附加字段:

VirtualDatastreamId  INT  NOT NULL
DatastreamId         INT  NOT NULL
FormulaElement       INT  NOT NULL

所有列都是主键。

这映射到的POCO是:

public class VirtualDatastreamMap 
{
    public virtual Datastream Datastream { get; set; }
    public virtual VirtualDatastream VirtualDatastream { get; set; }
    public virtual string FormulaElement { get; set; }
}

我在模型中没有外键属性,因为对我来说,外键的概念是一个实现细节,应该由类指定的关系封装。如果可能的话,我宁愿不添加这些。

如何使用Fluent API进行映射?我希望有类似下面的东西(不幸的是不起作用):

modelBuilder.Entity<VirtualDatastreamMap>()
            .HasKey(vdm => 
                new 
                { 
                    DatastreamId = vdm.Datastream.Id, 
                    VirtualDatastreamId = vdm.VirtualDatastream.Id, 
                    FormulaElement = vdm.FormulaElement 
                });

匿名类型的字段名称必须命名为对象,不能有两个具有相同名称的字段。

我从this question看到答案中提出了这个问题,但似乎没有任何进展。

如果不可能,这是一个更好的选择吗?

  1. 将外键属性添加到模型
  2. Id字段添加到数据库和模型
  3. 由于

1 个答案:

答案 0 :(得分:1)

复合主键的每一列都必须映射到实体中的标量属性。您理想的解决方案将无效。

在选项2中,您还必须创建一个唯一的密钥并检查唯一的密钥违规。 EF没有内置支持唯一键。因此我会选择选项1。