0

多対多の関係を明示的に定義しようとしています。明示的には、中間エンティティを定義し、FluentAPIを使用して構成していることを意味します。以下は私のコードです:

public class ContentType
{
    public Int64 Id { get; set; }
    public Guid SID { get; set; }
    public String Name { get; set; }
    public ContentType Parent { get; set; }
    public Nullable<Int64> ParentId { get; set; }
    public Category Category { get; set; }
    public Nullable<Int64> CategoryId { get; set; }
    public Boolean IsLocked { get; set; }
    public virtual ICollection<ContentTypeColumn> ContentTypeColumns { get; set; }
}

public class Column
{
    public Int64 Id { get; set; }
    public Guid SID { get; set; }
    public String SchemaName { get; set; }
    public DataType DataType { get; set; }
    public Int32 DataTypeId { get; set; }
    public virtual ICollection<ContentTypeColumn> ContentTypeColumns { get; set; }
}

public class ContentTypeColumn
{
    public Int64 Id { get; set; }
    public Int64 ColumnId { get; set; }
    public Column Column { get; set; }
    public ContentType ContentType { get; set; }
    public Int64 ContentTypeId { get; set; }
    public Boolean IsRequired { get; set; }
    public Boolean IsCalculated { get; set; }
    public String Title { get; set; }
    public Boolean IsSystem { get; set; }
    public Expression Expression { get; set; }
    public Int32 ExpressionId { get; set; }
    public virtual ICollection<ColumnRule> Rules { get; set; }
}

public class ContentTypeConfiguration : EntityTypeConfiguration<ContentType>
{
    public ContentTypeConfiguration()
    {
        this.ToTable("ContentType");
        this.Property(x => x.Id).HasColumnName("ContentTypeId").IsRequired();

        this.Property(x => x.Name).HasMaxLength(30);
        this.HasOptional(x => x.Parent)
            .WithMany()
            .HasForeignKey(x => x.ParentId);

        this.Property(x => x.SID).IsRequired();
    }
}

public class ContentTypeColumnConfiguration : EntityTypeConfiguration<ContentTypeColumn>
{
    public ContentTypeColumnConfiguration()
    {
        this.ToTable("ContentTypeColumn");
        this.HasRequired(x => x.ContentType)
            .WithMany()
            .HasForeignKey(x => x.ContentTypeId);
        this.Property(x => x.Title).HasMaxLength(50).IsRequired();
        this.Property(x => x.Id).HasColumnName("ContentTypeColumnId");
    }
}

ContentTypeColumn何らかの理由で、結果のテーブルに2つの外部キーが作成されています。1つはnull許容の外部キーであり、もう1つはnull許容ではありません。後者だけを生成したいのですが、null許容キーがどこから来ているのかわかりません。

何かご意見は?

4

1 に答える 1

1

これは間違っています:

this.HasRequired(x => x.ContentType)
    .WithMany()
    .HasForeignKey(x => x.ContentTypeId);

リバースナビゲーションプロパティがあるため、int inを使用する必要があります。そうしないとWithMany、EFによって2つの関係が作成される可能性があります。

this.HasRequired(x => x.ContentType)
    .WithMany(y => y.ContentTypeColumns)
    .HasForeignKey(x => x.ContentTypeId);

ところで。このマッピングは、デフォルトの規則によって自動的に検出されるため、まったく必要ありません。

于 2012-10-04T16:41:33.270 に答える