0

我有两个这样定义的表:

CREATE TABLE [SomeTable] (
[PrincipalID] [int] IDENTITY(1,1) NOT NULL,
[AnotherUniqueField] [varchar](50) NOT NULL,
[Data] [varchar](50) NOT NULL,
CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED ([PrincipalID] ASC))

CREATE TABLE [OtherTable] (
[OtherID] [int] NOT NULL,
[UniqueIfNotNullField] [varchar](20) NULL,
[OtherData] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_OtherTable] PRIMARY KEY CLUSTERED ([OtherID] ASC))

这两个表记录了相同概念对象的信息,我希望能够在我为它们拥有的 EF 实体中创建它们之间的关系,使用SomeTable.AnotherUniqueFieldOtherTable.UniqueIfNotNullField作为“键”。

SomeTable.AnotherUniqueField具有唯一索引,但显然不是 PK。 OtherTable.UniqueIfNotNullField如所示,当值不为空时是唯一的。(此约束在数据库中未强制执行,但表数据的来源受到保护,以保证存在值时的唯一性。)

以下是 POCO 实体:

public class SomeTable
{
    public int PrincipalID { get; set; }
    public int SameField { get; set; }
    public string Data { get; set; }
    public OtherTable Other { get; set; }
}

public class OtherTable
{
    public int OtherID { get; set; }
    public string SameField { get; set; }
    public string OtherData { get; set; }
}

我的EntityTypeConfiguration定义相同:

public class SomeTableMap : EntityTypeConfiguration<SomeTable>
{
    public SomeTableMap()
    {
        ToTable("SomeTable");
        HasKey(t => t.PrincipalID);
        Property(t => t.Data)
            .IsRequired()
            .HasMaxLength(50);
        Property(t => t.SameField)
            .HasMaxLength(50);
        Property(t => t.PrincipalID).HasColumnName("PrincipalID");
        Property(t => t.SameField).HasColumnName("AnotherUniqueField");
        Property(t => t.Data).HasColumnName("Data");
    }
}

public class OtherTableMap : EntityTypeConfiguration<OtherTable>
{
    public OtherTableMap()
    {
        ToTable("OtherTable");
        HasKey(t => t.OtherID);
        Property(t => t.OtherData)
            .IsRequired()
            .HasMaxLength(50);
        Property(t => t.SameField)
            .HasMaxLength(20);
        Property(t => t.OtherID).HasColumnName("OtherID");
        Property(t => t.SameField).HasColumnName("UniqueIfNotNullField");
        Property(t => t.OtherData).HasColumnName("OtherData");
    }
}

可以这样映射吗?我在 SomeTableMap 的构造函数中尝试了以下操作,但它不起作用。我对自定义映射的理解已经结束。

HasOptional<OtherTable>(x => x.Other)
    .WithOptionalPrincipal()
    .Map(
        map =>
            {
                map.MapKey("UniqueIfNotNullField");
                map.MapKey("AnotherUniqueField");
            });

这不是一个可映射的连接吗?我有另一个选择,因为OtherTable它不是真正的可编辑实体;我可以创建一个包含 SomeTable.PrincipalID 的关联值的视图,但我想看看这是否会首先起作用。

编辑:我也试过这个:

HasOptional(x => x.Other)
    .WithOptionalPrincipal()
    .Map(map => map.MapKey("UniqueIfNotNullField"));

但我得到错误:“ Each property name in a type must be unique. Property name 'UniqueIfNotNullField' was already defined.

4

1 回答 1

2

实体框架不支持这种关系。核心问题是缺少对 EF 中唯一约束的支持。因此,主体实体中的键始终必须是主键,如果要建立一对一关系,则依赖实体中的外键也必须是主键。

于 2012-08-20T08:53:43.327 回答