我有两个这样定义的表:
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.AnotherUniqueField
和OtherTable.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.
”