2016-03-07 4 views
1

Я дополнительное поле в моей модели под названием StatusChange, это заполняется с использованием sproc для извлечения всех полей из таблицы, а также дополнительного StatusChange поляEntity Framework: Игнорирование поля на Insert только

SELECT New.*, [dbo].[ftn_GetStatusChange](Old.MemberStatusId, New.MemberStatusId) AS StatusChange 
FROM Member New 
LEFT OUTER JOIN Member Old ON New.MemberNo = Old.MemberNo AND Old.ImportHistoryID = @ImportIdToCompare 
WHERE New.ImportHistoryID = @NewestImportId 

Вот функция

CREATE FUNCTION [dbo].[ftn_GetStatusChange] 
(
    @OldStatus char, 
    @NewStatus char 
) 
RETURNS int 
AS 
BEGIN 
    IF (@OldStatus IS NULL) 
    BEGIN 
     RETURN 1 
    END 

    IF (@OldStatus = 'R') 
     BEGIN 
      IF @NewStatus = 'C' RETURN 5 
      IF @NewStatus = 'S' RETURN 4 
     END 

    IF (@OldStatus = 'C') 
     BEGIN 
      IF @NewStatus = 'R' RETURN 3 
      IF @NewStatus = 'S' RETURN 4 
     END 

    IF (@OldStatus = 'S') 
     BEGIN 
      IF @NewStatus = 'C' RETURN 5 
      IF @NewStatus = 'R' RETURN 3 
     END 

    RETURN 0 
END 

Это перечисление, что номера карты для

public enum StatusChange 
    { 
     NoChange = 0, 
     New = 1, 
     Current = 2, 
     Resigned = 3, 
     Suspended = 4, 
     Reinstated = 5, 
    } 

В таблице базы данных не имеют поля StatusChange хотя, поскольку нет никакой необходимости в этом, поэтому я попытался добавить атрибут Рассчитанный свойству в C#

Это C# код

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public StatusChange StatusChange { get; set; } 

Однако, когда я звоните SaveChanges() на DbContext я получаю ошибку

Invalid column name 'StatusChange'. 

есть в любом случае я могу иметь это свойство для SELECT, только и игнорировать его на INSERT?

+1

Можете ли вы добавить атрибут '[NotMapped]' к свойству? Или это также приведет к тому, что свойство не будет установлено при загрузке? – Patrick

+1

Я пробовал это, но затем SPROC, выполняющий SELECT, игнорирует свойство StatusChange. – Coesy

+1

взглядом этого вам нужно будет изменить свой дизайн, чтобы сделать эту работу. Не можете ли вы использовать [NotMapped] и получить нужную информацию, а затем выполнить StatusChange отдельно. Например, просто укажите поле в списке Old.MemberStatusId, New.MemberStatusId и во время выполнения конвертируйте в состояния, – Seabizkit

ответ

0

Это не тестировалось и не 100%, что вы хотите как его довольно трудно визуализировать ваши данные, фактически без его ... но, возможно, это помогает ...

Пожалуйста, с щепотку соли его довольно сложно визуализировать ваши данные и требования ;-)

public class Member 
{ 
    [Key][AutoIncromentCode] 
    public int Id {get; set;} 
    public string MemberNo {get; set;} 
    public string FirstName { get; set;} 
    public int MemberStatusId { get; set;} 

    public int ImportHistortId { get; set;} 

    [NotMapped] 
    public MemberStatus 
    { 
     return (Status)MemberStatusId 
    } 
} 

public enum Status 
{ 
    NoChange = 0, 
    New = 1, 
    Current = 2, 
    Resigned = 3, 
    Suspended = 4, 
    Reinstated = 5, 
} 

public class MemberStatusDto 
{ 
    public Member NewMember {get; set;} 
    public Member OldMember {get; set;} 
} 

public void GetSomeStuff(int importHistortId) 
{ 
    List<MemberStatusDto> result = (from N_Memeber in Content.Member 
             join O_Member in Content.Member on 
             new { N_Memeber.MemberNo, O_Member.ImportHistortId } equals new {MemberNo = O_Member.MemberNo, ImportHistortId = importHistortId } 
             into T_Members 
             from A_Members in T_Members.DefaultIfEmpty() 
             where N_Memeber.ImportHistoryID = importHistortId 
            select new MemberStatusDto() 
            { 
             NewMember = A_Members.N_Memeber, 
             OldMember = A_Members.O_Member 
            }).Tolist();    

    foreach(var item in result) 
    { 
     var NewState = item.NewMember.MemberStatus; 
     var oldState = (item.OldMember == null) ? "nothing" : item.OldMember.MemberStatus 

    } 
} 
+0

Лично было бы намного лучше, если бы вы переместили все элементы истории в другую таблицу! и тогда вы можете использовать EF для автоматической ссылки на это и упорядочить по дате, когда вы отпустите член ... это будет гораздо более умный дизайн. – Seabizkit

Смежные вопросы