Entity framework 4 EF CTP4:如何告诉EF列不是标识

Entity framework 4 EF CTP4:如何告诉EF列不是标识,entity-framework-4,entity-relationship,Entity Framework 4,Entity Relationship,我有一个代码优先的POCO项目,在这个项目中,我试图调整一个现有的数据库,以便在给定现有模型的情况下,它与EF所期望的同步 我有以下实体: public class FlaggedDate { [Key] public long scheduledDayID { get; set; } [Required] public DateTime date { get; set; } [StringLength(50)] [Required] pu

我有一个代码优先的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; }
}
这两者之间的关系是1:0 | 1——也就是说,FlaggedDate将存在,但它可能有也可能没有相应的单个访问对象

EF认为,基于这个模型,FlaggedDate应该有一个额外的字段,visit_flaggedDateScheduledDayID,它是可以为空的。我终于明白了原因:它认为Visit字段flaggedDateScheduledDayID是一个标识列。它不应该是一个身份栏;它应该是一个连接到FlaggedDate的外键

我认为它是按照惯例做到这一点的:我记得在CTP4中读到的内容是,任何一个单键的int或long字段都被假定为一个标识列

我有没有办法告诉EF这不是一个标识列?我试图摆弄Fluent API,但这对我来说是个谜,并且没有数据注释可以用于此


或者,有没有其他方法可以修改导航属性以使其正确显示?

我发现我可以用以下代码覆盖标识行为:

 modelBuilder.Entity<Visit>().Property(v => v.flaggedDateScheduledDayID).StoreGeneratedPattern = System.Data.Metadata.Edm.StoreGeneratedPattern.None;
modelBuilder.Entity().Property(v=>v.flaggedDateScheduledDayID).StoreGeneratedPattern=System.Data.Metadata.Edm.StoreGeneratedPattern.None;

但是,它仍然没有使其成为外键。不过,我想这是另一个问题。似乎将StoreGeneratedPattern设置为None是覆盖默认行为的方法。

如果您使用的是带有fluent API的映射文件

this.Property(t => t.Id)
   .HasColumnName("Site_ID")
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
我想它也应该以声明的方式工作

[HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)]
虽然我没有试过

[HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)]