到目前为止我找到的Q& A似乎都没有解决这个问题。
我正在从自定义DAL迁移到EF6,因此实体类和数据库已经存在。我正在尝试将DataAnnotations保留在实体类之外。
LiveCourseOpportunity 可以拥有广告系列。并且Campaign 可以具有LiveCourseOpportunity(至少在Campaign类必须具有指向其LiveCourseOpportunity的Navigation属性的意义上)。在数据库中,这被实现为具有CampaignId作为FK的LiveCourseOpportunities表。
这是我到目前为止的(相关)代码:
LiveCourseOpportunity实体
public int DatabaseId { get; set; } // PK
public int? CampaignId { get; set; }
public virtual Campaign Campaign { get; set; }
广告系列实体
public int DatabaseId { get; set; } // PK
public virtual ICollection<LiveCourseOpportunity> LiveCourseOpportunities { get; set; }
模型
modelBuilder.Entity<Campaign>()
.HasKey(T => T.DatabaseId)
.Property(T => T.DatabaseId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<LiveCourseOpportunity>()
.HasKey(T => T.DatabaseId)
.Property(T => T.DatabaseId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
modelBuilder.Entity<Campaign>()
.HasMany(c => c.LiveCourseOpportunities)
.WithOptional(o => o.Campaign)
.HasForeignKey(o => o.CampaignId);
上面的关系来自数据库的EF逆向工程......由于某种原因,一对多。
任何人都可以建议正确的映射来完成这项工作吗?
答案 0 :(得分:1)
对于数据库,外键总是一对多,除非键字段具有唯一索引。
但是,在EF中,您可以将其映射为可选的一对一关联(0..1 - 0..1):
modelBuilder.Entity<Campaign>()
.HasOptional(e => e.LiveCourseOpportunity)
.WithOptionalPrincipal(e => e.Campaign)
.Map(m => m.MapKey("CampaignId"));
数据库仍然不知道它的0..1-n(即有一个可空的外键CampaignId
),但EF会执行验证来强制执行一个一对一协会。