EF必需可选关系不使用FK的右列

时间:2016-12-23 10:52:51

标签: entity-framework foreign-keys ef-fluent-api identity-column

我已经阅读了很多问题,但仍无法找到解决问题的方法。

我正在尝试这样的事情,我很快就画了

enter image description here

首先尝试:

public class CarMap : EntityTypeConfiguration<Car>
    {
        public CarMap()
        {
            ToTable("Cars", Constants.Schema);
            Property(t => t.EngineId);

            HasRequired(x => x.SPropertyPolicyInsurance).WithMany().HasForeignKey(x => x.SPropertyPolicyInsuranceId);
        }
    }



public class Car : MyBase
    {
        public int EngineId { get; set; }
        public virtual Engine Engine { get; set; }
    }


public class EngineMap : EntityTypeConfiguration<Engine>
    {
        public EngineMap()
        {
            ToTable("Engines", Constants.Schema);

            Property(t => t.MyField1).HasColumnType("nvarchar").HasMaxLength(128).IsRequired();
            Property(t => t.MyField2).HasColumnType("nvarchar").HasMaxLength(128).IsRequired();
            Property(t => t.MyField3).HasColumnType("bit").IsRequired();            
        }
    }


public class Engine : MyBase
    {
        public string MyField1 { get; set; }
        public string MyField2 { get; set; }
        public bool MyField3 { get; set; }

        public virtual Car Car { get; set; }
    }

使用此解决方案,我会在我的引擎表上创建一个我不想要的新列...

第二次尝试:

将CarMap更改为以下代码:

public class CarMap : EntityTypeConfiguration<Car>
    {
        public CarMap()
        {
            ToTable("Cars", Constants.Schema);
            Property(t => t.EngineId);

            HasRequired(x => x.Engine).WithOptional(p => p.Car);
        }
    }

问题是它没有使用EngineId列存储我的FK密钥值...

非常感谢你的帮助......

1 个答案:

答案 0 :(得分:0)

没关系,它现在正在工作,我清理了所有代码,删除了可能存在冲突的额外关系,现在使用以下Fluent API关系,它只使用一个FK列( ENGINEID)。

生成的代码首次迁移如下:

CreateTable(
     "myschema.Engines",
       c => new
       {
          Id = c.Int(nullable: false),
          myfield = c.String(nullable: false, maxLength: 128),
          myfield2 = c.String(nullable: false, maxLength: 128),
          myfield3 = c.Boolean(nullable: false),
       })
  .PrimaryKey(t => t.Id)
  .ForeignKey("basechema.Engines", t => t.Id)
  .Index(t => t.Id);


CreateTable(
     "myschema.Cars",
        c => new
        {
            Id = c.Int(nullable: false),
            EngineId = c.Int(nullable: false),
        })
   .PrimaryKey(t => t.Id)
   .ForeignKey("baseschema.Cars", t => t.Id)
   .ForeignKey("myschema.Engines", t => t.EngineId)
   .Index(t => t.Id)
   .Index(t => t.EngineId);

我希望它可以帮助那里的人;)