我有一个代码优先的POCO项目,在这个项目中我尝试调整现有数据库,以便在给定现有模型的情况下与EF期望的内容同步。
我有这些实体:
public class FlaggedDate
{
[Key]
public long scheduledDayID { get; set; }
[Required]
public DateTime date { get; set; }
[StringLength(50)]
[Required]
public string dateStatus { get; set; }
[Required]
public bool isVisit { get; set; }
[Required]
public bool hasAvailableSlots { get; set; }
[Required]
public bool hasInterviewsScheduled { get; set; }
// navigation properties
public ICollection<ScheduledSchool> scheduledSchool { get; set; }
public ICollection<Interview> interviews { get; set; }
public ICollection<PartialDayAvailableBlock> partialDayAvailableBlocks { get; set; }
public Visit visit { get; set; }
public ICollection<Event> events { get; set; }
}
和
public class Visit
{
[Key]
public long flaggedDateScheduledDayID { get; set; }
[Required]
public bool isFullDay { get; set; }
// navigation property
public FlaggedDate flaggedDate { get; set; }
}
这两者之间的关系是1:0 | 1 - 即,FlaggedDate将存在,但它可能有也可能没有相应的单个Visit对象。
根据这个模型,EF认为FlaggedDate应该有一个额外的字段,visit_flaggedDateScheduledDayID,它是可以为空的。我终于明白了原因:它认为Visit字段flaggedDateScheduledDayID是一个标识列。它不应该是一个标识列;它应该是连接到FlaggedDate的外键。
我认为按照惯例这样做:我记得在CTP4中读到了一些东西,即单个键并且为int或long的任何字段都被认为是一个标识列。
有什么方法可以告诉EF这不是一个标识栏吗?我试着摆弄Fluent API,但这对我来说是一个谜,并且没有可用于此的数据注释。
或者,或者,有什么方法可以摆弄导航属性以使其正确出现?
答案 0 :(得分:3)
如果您正在使用具有流畅API的映射文件
this.Property(t => t.Id)
.HasColumnName("Site_ID")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
我认为它也应该以声明方式起作用
[HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)]
虽然我没有尝试过。
答案 1 :(得分:0)
我发现我可以使用以下代码覆盖身份行为:
modelBuilder.Entity<Visit>().Property(v => v.flaggedDateScheduledDayID).StoreGeneratedPattern = System.Data.Metadata.Edm.StoreGeneratedPattern.None;
然而,它仍然没有成为外键。不过,我猜这是一个不同的问题。似乎将StoreGeneratedPattern设置为None是覆盖默认行为的方法。