2010-09-13 53 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)] 

雖然我沒有嘗試。