与Entity Framework Fluent API的一对一关系

我在我的一个实体上进行反向导航时遇到问题。

我有以下两个对象:

public class Candidate { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public long CandidateId { get; set; } .... // Reverse navigation public virtual CandidateData Data { get; set; } ... // Foreign keys .... } public class CandidateData { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public long CandidateDataId { get; set; } [Required] public long CandidateId { get; set; } // Foreign keys [ForeignKey("CandidateId")] public virtual Candidate Candidate { get; set; } } 

现在我在CandidateData对象上的外键导航工作正常。 我无法获得候选对象的反向导航(如果可能的话)。

这是我的OnModelCreating函数:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); modelBuilder.Entity() .HasOptional(obj => obj.Data) .WithOptionalPrincipal(); base.OnModelCreating(modelBuilder); } 

它接近工作,除了在数据库中我得到两个链接到CandidateId的列。 我从POCO对象得到了一个我得到的另一列Candidate_CandidateId我假设是由modelBuilder创建的。

此刻我很安静。 有人可以了解一下发生了什么吗?

一对一的问题……问题是EF和CODE首先,当1:1时,依赖者有一个引用主体的主键。 虽然你可以用DB来定义一个DB,但实际上你可以用DB来定义一个DB,你甚至可以在Primary上定义一个可选的FK。 EF首先在Code中进行此限制。 公平够了我想……

反过来说:如果您不同意,IS已经对您可能忽略的方式添加了一些意见 🙂

 using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; namespace EF_DEMO { class FK121 { public static void ENTRYfk121(string[] args) { var ctx = new Context121(); ctx.Database.Create(); System.Console.ReadKey(); } } public class Candidate { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]// best in Fluent API, In my opinion.. public long CandidateId { get; set; } // public long CandidateDataId { get; set; }// DONT TRY THIS... Although DB will support EF cant deal with 1:1 and both as FKs public virtual CandidateData Data { get; set; } // Reverse navigation } public class CandidateData { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] // best in Fluent API as it is EF/DB related public long CandidateDataId { get; set; } // is also a Foreign with EF and 1:1 when this is dependent // [Required] // public long CandidateId { get; set; } // dont need this... PK is the FK to Principal in 1:1 public virtual Candidate Candidate { get; set; } // yes we need this } public class Context121 : DbContext { static Context121() { Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); } public Context121() : base("Name=Demo") { } public DbSet Candidates { get; set; } public DbSet CandidateDatas { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity(); modelBuilder.Entity() .HasRequired(q => q.Candidate) .WithOptional(p=>p.Data) // this would be blank if reverse validation wasnt used, but here it is used .Map(t => t.MapKey("CandidateId")); // Only use MAP when the Foreign Key Attributes NOT annotated as attributes } } 

}

我认为外键应该创建为:.Map(t => t.MapKey(“CandidateDataId”))因为thsi外键将放在Candidate表中…

你觉得呢?