私はそのように定義された2つのテーブルを持っています:
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))
SomeTable.AnotherUniqueField
これらの2つのテーブルは、同じ概念オブジェクトに関する情報を記録します。これらのテーブルに対して、およびOtherTable.UniqueIfNotNullField
を「キー」として使用して、それらの間にあるEFエンティティでそれらの間に関係を作成できるようにしたいと思います。
SomeTable.AnotherUniqueField
一意のインデックスがありますが、明らかにPKではありません。 OtherTable.UniqueIfNotNullField
示されているように、値がnullでない場合は一意です。(この制約はデータベースでは適用されませんが、値がある場合に一意性を保証するために、テーブルのデータのソースが保護されます。)
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.
"