Mapping Many-to-Many Relationship With Defined Middle Entity in Entity Framework 5

岁酱吖の 提交于 2019-12-13 04:12:39

问题


I'm trying to define a many-to-many relationship explicitly. By explicitly, I mean that I'm defining the middle entity and configuring it using the Fluent API. Below is my code:

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");
    }
}

For some reason, two foreign keys are being created on the resultant ContentTypeColumn table. One is a nullable foreign key, the other is non-nullable. I want only the latter to be generated, and I have no idea where the nullable key is coming from.

Any thoughts?


回答1:


This is wrong:

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

You have reverse navigation property so you must use int in WithMany or EF will probably create two relations:

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

Btw. this mapping should not be needed at all because it is discovered automatically through default conventions.



来源:https://stackoverflow.com/questions/12730218/mapping-many-to-many-relationship-with-defined-middle-entity-in-entity-framework

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!