Coesy
Coesy

Reputation: 936

Entity Framework: Ignoring a field on Insert only

I have an extra field in my model called StatusChange, this is populated using a sproc to fetch all fields from the table as well as the extra field StatusChange

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 

Here is the function

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

This is the enum that the numbers map to

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

The Database table doesn't have the field StatusChange though as there is no need for it, so I tried adding the attribute Computed to the property in C#

This is the C# code

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

However when I call SaveChanges() on the DbContext I get the error

Invalid column name 'StatusChange'.

Is there anyway I can have this property for SELECT only and ignore it on INSERT?

Upvotes: 2

Views: 1345

Answers (1)

Seabizkit
Seabizkit

Reputation: 2415

This is not tested and is not 100% what you want as its quite hard to visualize your data without actually having it... but maybe this helps...

Please take with a pinch of salt its quite hard to visualize your data and requirements ;-)

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

    }
}

Upvotes: 1

Related Questions