EF 6如何在DB没有显式关系时正确映射

时间:2014-06-12 05:17:12

标签: c# entity-framework

我对EF 6来说是合情合理的,

小背景信息: 当前的数据库设置不允许作为数据库模式中的约束,因此所有关联都在代码中完成。另外,我们只在需要时显式加载关系,否则引用将为null。

问题是我将Mapping Task映射到Task_Postion ,我需要作为双向联想。

        public TaskPositionMapping()
        {
            this.ToTable("MIC_Task_Position");
            this.HasKey(p => new { p.TaskId, p.PositionId });            
            this.Property(p => p.TaskId).HasColumnName("NM_TASK");
            this.Property(p => p.PositionId).HasColumnName("NO_POSITION_TYPE_COUNT").HasColumnType("int");
            this.HasMany(p=>p.Tasks).WithRequired(p => p.TaskPosition).HasForeignKey(p=>p.TaskId);
        }

       public TaskMapping()
       {
           this.ToTable("MIC_Task");
           this.HasKey(p => p.TaskId);
           this.Property(p => p.TaskId).HasColumnName("NM_TASK");           
           this.HasMany(p => p.TaskSkills);
            this.HasRequired(p => p.TaskPosition).WithMany(p => p.Tasks).HasForeignKey(p => p.TaskId);
       }

public partial class Task
{
    public Task()
    {        
    }

    public string TaskId { get; set; }     

    [DataMember, IgnoreDataMember()]
    public virtual ICollection<TaskSkill> TaskSkills { get; set; }

    [DataMember, IgnoreDataMember()]
    public virtual TaskPosition TaskPosition { get; set; }

}

public class TaskPosition
    {
        public string  TaskId 
        { 
            get; 
            set;
        }

        public short PositionId
        {
            get;
            set;
        }

        [DataMember, IgnoreDataMember()]
        public virtual Task Task { get; set; }
    }

我收到了错误:

  • TaskPosition_Tasks_Target :: Multiplicity在Role中无效 'TaskPosition_Tasks'关系中的'TaskPosition_Tasks_Target'。 因为从属角色是指关键属性,所以是上层 依赖角色的多样性的界限必须为'1'。

  • TaskPosition_Tasks_Source_TaskPosition_Tasks_Target ::数量 关系中的从属和主要角色中的属性 约束必须相同。

1 个答案:

答案 0 :(得分:0)

问题被确定为关系倒退。

EF 6不允许上述关系,因为外键签名需要与主键匹配。

将One切换为Many允许在TaskId上使用Key - Foreign Key关系

如果您需要具有上述描述的关系,似乎您需要在EF 6之外手动处理,并且需要单独调用您的存储库以在需要时填充数据。