2010-09-13 20 views
1

我有一个代码优先的POCO项目,我试图调整现有的数据库,以便与EF预期的一致,并给定我的现有模型。EF CTP4:如何判断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会存在,但它可能会或可能不会有相应的单个访问对象。

EF认为,基于此模型,FlaggedDate应该有一个额外的字段visit_flaggedDateScheduledDayID,它可以为空。我终于明白了原因:它认为访问字段flaggedDateScheduledDayID是一个标识列。它不应该是一个身份专栏;它应该是连接到FlaggedDate的外键。我认为它按照约定来做这件事情:我记得阅读一些东西,在CTP4中,任何单个键是int或long的字段都被认为是一个标识列。

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

或者,或者,我有什么办法可以摆弄导航属性来让它出来吗?

回答

0

我发现我可以用这个代码重写身份行为:

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

但是,它仍然没有把它的外键。不过,我想这是一个不同的问题。看来将StoreGeneratedPattern设置为None是覆盖默认行为的方式。

3

如果您使用的是与流利的API映射文件

this.Property(t => t.Id) 
    .HasColumnName("Site_ID") 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

我会想象它应该也可以声明

[HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)] 

虽然我没有尝试。