Reputation: 936
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
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