Sto utilizzando EF 6 e utilizzo una strategia TPT per modellare il mio problema. Rule
è una classe astratta. OvertimeRule
è una classe concreta, che eredita da Rule
.EF e TPT: il nome della colonna è specificato più di una volta nella clausola SET
Rule
assomiglia a questo:
public abstract class Rule
{
public int Id { get; set; }
public PeriodType PeriodType { get; set; }
public int SortOrder { get; set; }
public int StatuteId { get; set; }
public bool IsActive { get; set; }
}
OvertimeRule
assomiglia a questo:
public partial class OvertimeRule : Rule
{
public decimal? ThresholdCoefficient { get; set; }
public decimal? LimitCoefficient { get; set; }
}
Quando creo un nuovo OvertimeRule
e cercare di salvarlo, EF genera prima questa query:
INSERT [dbo].[Rules]([PeriodType], [SortOrder], [StatuteId], [IsActive], [StatuteID])
VALUES (@0, @1, @2, @3, @4, @5, @6, NULL)
Come potete vedere, EF aggiunge unoColonnaall'inserto, che non esiste da nessuna parte nella soluzione e rende questa una query SQL non valida.
SQL poi getta giustamente: The column name 'StatuteId' is specified more than once in the SET clause. A column cannot be assigned more than one value in the same SET clause. Modify the SET clause to make sure that a column is updated only once. If the SET clause updates columns of a view, then the column name 'StatuteId' may appear twice in the view definition.
La mappatura si presenta così:
modelBuilder.Entity<Rule>().ToTable("Rules", TimmiSchemaName);
modelBuilder.Entity<Rule>().HasRequired(s => s.Statute).WithMany(s => s.Rules).HasForeignKey(r => r.StatuteId);
modelBuilder.Entity<OvertimeRule>().ToTable("OverTimeRules", TimmiSchemaName);
Qualcuno potrebbe dirmi che cosa potrebbe innescare questo comportamento?
Mostra la tua definizione OvertimeRule prega – tede24
fatto. Niente di interessante da vedere davvero qui .. –