2010-09-13 4 views
1

J'ai un projet POCO en code-I dans lequel j'essaie d'ajuster une base de données existante pour qu'elle se synchronise avec ce que EF attend, étant donné mon modèle existant.EF CTP4: Comment dire à EF qu'une colonne n'est PAS une identité

Je ces entités:

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; } 
} 

et

public class Visit 
{ 
    [Key] 
    public long flaggedDateScheduledDayID { get; set; } 
    [Required] 
    public bool isFullDay { get; set; } 

    // navigation property 
    public FlaggedDate flaggedDate { get; set; } 
} 

La relation entre ces deux est 1: 0 | 1 - c.-à-FlaggedDate existera mais il peut ou non avoir un Objet de visite unique correspondant.

EF pense, sur la base de ce modèle, que FlaggedDate devrait avoir un champ supplémentaire, visit_flaggedDateScheduledDayID, qui est nullable. J'ai finalement réalisé pourquoi: il pense que le champ Visit, flaggedDateScheduledDayID, est une colonne d'identité. Ce n'est pas censé être une colonne d'identité; c'est supposé être une clé étrangère qui se connecte à FlaggedDate. Je pense que cela se fait par convention: Je me souviens avoir lu quelque chose à l'effet que dans CTP4, tout champ qui est une seule clé et est int ou long est supposé être une colonne d'identité.

Est-ce que je peux dire à EF que ce n'est PAS une colonne d'identité? J'ai essayé de jouer avec l'API Fluent, mais c'est un mystère pour moi, et il n'y a pas d'annotations de données que vous pouvez utiliser pour cela.

Ou, alternativement, est-ce que je peux me débrouiller avec les propriétés de navigation pour que ça sorte?

Répondre

0

J'ai découvert que je peux remplacer le comportement d'identité avec ce code:

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

Cependant, il est toujours pas fait une clé étrangère. Je suppose que c'est une question différente, cependant. Il semble que définir StoreGeneratedPattern sur None est le moyen de remplacer le comportement par défaut.

3

Si vous utilisez des fichiers de mapping avec l'API couramment

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

J'imagine qu'il devrait aussi travailler déclarative

[HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)] 

bien que je ne l'ai pas essayer.