0

私はそのように定義された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."

4

1 に答える 1

2

エンティティフレームワークはこの関係をサポートしていません。コアの問題は、EFの一意性制約のサポートが欠落していることです。したがって、プリンシパルエンティティのキ​​ーは常にプライマリキーである必要があり、1対1の関係を構築する場合は、依存エンティティの外部キーもプライマリキーである必要があります。

于 2012-08-20T08:53:43.327 に答える