IIS Enable the HTTP Keep-Alive in Powershell - iis

The page http://technet.microsoft.com/en-us/library/cc772183(v=ws.10).aspx explains how to Enable the HTTP Keep-Alive Response Header (IIS 7)
I want to do this in Powershell by WMI
It says:
Use the following WMI classes, methods, or properties to perform this
procedure:
HTTPProtocolSection.AllowKeepAlive property
I've tried:
PS > Get-WmiObject -Class HTTPProtocolSection
Get-WmiObject : Invalid class
At line:1 char:14
+ Get-WmiObject <<<< -Class HTTPProtocolSection
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
What's the right way of using this HTTPProtocolSection class and enabling AllowKeepAlive property?

You can also set it with the Set-WebConfiguration cmdlet:
Set-WebConfiguration -Filter system.webServer/httpProtocol -PSPath MACHINE/WEBROOT/APPHOST -Value #{allowKeepAlive=$true}

To discover class in a particular namespace try this
PS c:\>Get-WmiObject -List * "root\webadministration"
and to find a match do this
PS c:\>Get-WmiObject -List * "root\webadministration" | Where-Object {$_.name -match "Http"}
PS C:\>Get-WmiObject -Namespace "root\webadministration" -class HttpProtocolSection | Get-Member
TypeName: System.Management.ManagementObject#root\webadministration\HttpProtocolSection
Name MemberType Definition
---- ---------- ----------
PSComputerName AliasProperty PSComputerName = __SERVER
Add Method System.Management.ManagementBaseObject Add(System.String CollectionName, System.Ma...
Clear Method System.Management.ManagementBaseObject Clear(System.String CollectionName)
Get Method System.Management.ManagementBaseObject Get(System.String CollectionName, System.St...
Remove Method System.Management.ManagementBaseObject Remove(System.String CollectionName, System...
RevertToParent Method System.Management.ManagementBaseObject RevertToParent(System.String PropertyName)
AllowKeepAlive Property bool AllowKeepAlive {get;set;}
CustomHeaders Property System.Management.ManagementObject#CustomHeaderSettings CustomHeaders {get;set;}
Location Property string Location {get;set;}
Path Property string Path {get;set;}
RedirectHeaders Property System.Management.ManagementObject#RedirectHeaderSettings RedirectHeaders {get;set;}
SectionInformation Property System.Management.ManagementObject#SectionInformation SectionInformation {get;set;}
__CLASS Property string __CLASS {get;set;}
__DERIVATION Property string[] __DERIVATION {get;set;}
__DYNASTY Property string __DYNASTY {get;set;}
__GENUS Property int __GENUS {get;set;}
__NAMESPACE Property string __NAMESPACE {get;set;}
__PATH Property string __PATH {get;set;}
__PROPERTY_COUNT Property int __PROPERTY_COUNT {get;set;}
__RELPATH Property string __RELPATH {get;set;}
__SERVER Property string __SERVER {get;set;}
__SUPERCLASS Property string __SUPERCLASS {get;set;}
ConvertFromDateTime ScriptMethod System.Object ConvertFromDateTime();
ConvertToDateTime ScriptMethod System.Object ConvertToDateTime();
You can then do something like this to get the value of AllowKeepAlive
PS C:\> (get-wmiobject -namespace "root\webadministration" -class HttpProtocolSection).AllowKeepAlive
True
PS C:\>$a = Get-WmiObject -Namespace "root\webadministration" -class HttpProtocolSection
PS C:\>$a.AllowKeepAlive = $false
PS C:\>$a.Put()

Related

Calling Excel VSTO Addin from PowerShell

I have built a VSTO addin for Excel which refreshes a number of PowerQuery workbook connections. So as to avoid an error blocking the main thread causing a "Cartridge not loaded" error I have to run the main code in another thread.
I am doing this via Async method.
I also need this to work from the command line so i have exposed the code as a COM visible interface and exposed it in ThisAddIn.vb
Protected Overrides Function RequestComAddInAutomationService() As Object
If headless Is Nothing Then
headless = New HeadlessExec()
End If
Return headless
End Function
This is the interface class
Imports System.Data
Imports System.Runtime.InteropServices
Imports log4net
Imports System.Threading.Tasks
<ComVisible(True)>
Public Interface IHeadlessExec
Function RefreshDIT() As Task(Of Boolean)
Function GetState() As String
Function GetStatusDetails() As String
End Interface
<ComVisible(True)>
<ClassInterface(ClassInterfaceType.None)>
Public Class HeadlessExec
Implements IHeadlessExec
Private log As ILog
Private logdir As String = ThisAddIn.logdir
Sub New()
'Initialise here
log = LogManager.GetLogger("HeadlessExec")
log.Info("Constructor")
End Sub
Public Async Function RefreshDIT() As Task(Of Boolean) Implements IHeadlessExec.RefreshDIT
log.Debug("Start")
Dim pq As New PowerQueryRefresh
Dim ExecDIT As Task(Of Boolean) = pq.ExecRefreshInNewThread()
Dim status As Boolean = Await ExecDIT
Return status
log.Debug("End")
End Function
Public Function GetState() As String Implements IHeadlessExec.GetState
log.Debug("Start")
Dim pq As New PowerQueryRefresh
GetState = pq.GetState
log.Debug("GetStateVSTO:" & GetState)
log.Debug("End")
End Function
Public Function GetStatusDetails() As String Implements IHeadlessExec.GetStatusDetails
log.Debug("Start")
Dim pq As New PowerQueryRefresh
GetStatusDetails = pq.GetStatusDetails
log.Debug("GetStatusDetailsVSTO:" & GetStatusDetails)
log.Debug("End")
End Function
I am calling this from Powershell via COM as follows - the key part is ExecuteVSTOAdd_DITRefresh
:-
Function RunVSTOProc() {
$error.Clear()
try {
$FilePath = GetMostRecentFile($BASEDIR)
OpenExcelWithFile($FilePath)
$ret = ExecuteVSTOAdd_DITRefresh
} catch {
HandleError($_)
}
if ($vstostate -eq "Error"){
CleanUpExcel
Exit
}
if (!$error){
# Only save it if we have no errrors
$newname = NewName($FilePath)
Write-Host "Saving as $newname"
$workbook.saveAs($newname)
}
CleanUpExcel
Write-Host "Completed Running DIT"
}
ExecuteVSTOAdd_DITRefresh
Function ExecuteVSTOAdd_DITRefresh(){
try {
$DITAddin = $global:excel.COMAddins.Item("DITUtility")
Write-Host "Addin $($DITAddin.ProgID) is connected"
$autom = $DITAddin.Object
$CallProc = $autom.RefreshDIT()
Write-Host "DIT Refreshed within VSTO"
$CallProc
} Catch {
HandleError($_)
}
}
This issue is that when RefreshDIT runs Powershell doesn't wait for it to complete. EDIT :- I had an issue with establishing com automation - NOW - i can see details for $DITAddin and I can see the exposed methods BUT I cannot see the exposed method RefreshDIT - even though i can call it - this one is Async and the others are not Async method. Its also not obvious to me how to call it Async from Powershell so it functions as an Async method. Any pointers?
$DITAddin | Get-Member
TypeName: System.__ComObject#{000c033a-0000-0000-c000-000000000046}
Name MemberType Definition
---- ---------- ----------
Application Property IDispatch Application () {get}
Connect Property bool Connect () {get} {set}
Creator Property int Creator () {get}
Description Property string Description () {get} {set}
Guid Property string Guid () {get}
Object Property IDispatch Object () {get} {set}
Parent Property IDispatch Parent () {get}
ProgId Property string ProgId () {get}
$autom | Get-Member
TypeName: System.__ComObject#{159faa2b-4a8e-3bca-bb69-e2268f06d436}
Name MemberType Definition
---- ---------- ----------
GetState Method string GetState ()
GetStatusDetails Method string GetStatusDetails ()
If I run
$CallProc = $autom.RefreshDIT()
$CallProc | Get-Member
TypeName: System.__ComObject
Name MemberType Definition
---- ---------- ----------
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
ToString Method string ToString
()
There is no Run() method and if I try and execute it i get
$CallProc.Run()
Method invocation failed because [System.__ComObject] does not contain a method named 'Run'.
At line:1 char:1
+ $CallProc.Run()
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
That failed with ERROR ExecuteVSTOAdd_DITRefresh :
RunDIT_VSTO.ps1:164 char:9
+ [System.Threading.Tasks.Task]$tskRefreshDIT = $autom.RefreshD ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
Solved the problem.
The Async method wasn't displaying in Powershell when performing a Get-Member on the object but the NON Async methods were.
I already had a an async function with an Await statement in VB.NET so i wrapped it a function without the Async modifier and called that:-
This in the main body of the code:-
Public Async Function ExecRefreshInNewThread() As Task(Of Boolean)
Dim msg As String
Try
Dim tasks As New List(Of Tasks.Task)()
tasks.Add(Task.Run(AddressOf RefreshSequenceOfConnectionsH))
Await Task.WhenAll(tasks)
log.Info("Executed without error")
Return True
Catch e As Exception
msg = FormatExceptionMsg(e)
log.Error(msg)
Return False
End Try
End Function
Public Function ExecRefreshInNewThread_v2() As Boolean
Dim boo As Task(Of Boolean) = ExecRefreshInNewThread()
Return boo.Result
End Function
This in the interface class:-
Public Function RefreshDITv2() As Boolean Implements IHeadlessExec.RefreshDITv2
log.Debug("Start")
Dim pq As New PowerQueryRefresh
Dim ExecDIT As Boolean = pq.ExecRefreshInNewThread_v2
Return ExecDIT
log.Debug("End")
End Function
Then this worked in Powershell:-
Function ExecuteVSTOAdd_DITRefresh(){
try {
$DITAddin = $global:excel.COMAddins.Item("DITUtility")
Write-Host "Addin $($DITAddin.ProgID) is connected"
$autom = $DITAddin.Object
$tskRefreshDIT = $autom.RefreshDITv2()
Write-Host "DIT Refreshed within VSTO $CallProc"
$tskRefreshDIT
} Catch {
HandleError($_)
}
}
Now it waits before moving on.
Try using the Wait method of the task from your async RefreshDIT function:
$tskRefreshDIT = $autom.RefreshDIT()
$bolSuccess = $tskRefreshDIT.Run()
$bolSuccess = $task.Wait(60000)
if ($bolSuccess -eq $true) {
$CallProc
}

Can I alias a field in a PXSelector

I have a selector defined as follows:
[PXSelector(typeof(Search2<xTACTaxDocument.iD,
InnerJoin<xTACEntityMappingEIN,
On<xTACTaxDocument.clientEINID, Equal<xTACEntityMappingEIN.iD>>,
InnerJoin<xTACEntityMappingEIN1,
On<xTACTaxDocument.investmentEINID, Equal<xTACEntityMappingEIN1.iD>>>>>),
typeof(xTACTaxDocument.iD),
typeof(xTACTaxDocument.formID),
typeof(xTACTaxDocument.year),
typeof(xTACEntityMappingEIN.eIN),
typeof(xTACEntityMappingEIN1.eIN))]
Where I define an alias DAC as follows(redefining the fields I need to use) :
[Serializable]
public class xTACEntityMappingEIN1 : xTACEntityMappingEIN
{
public abstract new class iD : IBqlField { }
public abstract new class eIN : IBqlField { }
}
My question is - since the original ein and aliased DAC ein fields have the same name - is it possible - purely in the displayed grid - to rename the second one? Or, ideally, rename both of them? Didn't see that as an option anywhere in the intellisense...
This is kind of what I'm looking to do (see the aliased fields):
select xTACTaxDocument.iD
,xTACTaxDocument.FormID
,xTACTaxDocument.Year
,xTACEntityMappingEIN.EIN as 'ClientEIN'
,xTACEntityMappingEIN1.EIN as 'InvestmentEIN'
from xTACTaxDocument
Inner Join xTACEntityMappingEIN
On xTACTaxDocument.clientEINID = xTACEntityMappingEIN.iD
Inner Join xTACEntityMappingEIN xTACEntityMappingEIN1
On xTACTaxDocument.investmentEINID = xTACEntityMappingEIN1.iD
The only option would be to additionally override the EIN property in the xTACEntityMappingEIN1 DAC to use a different DisplayName in PXUIFieldAttribute:
[Serializable]
public class xTACEntityMappingEIN1 : xTACEntityMappingEIN
{
public abstract new class iD : IBqlField { }
public abstract new class eIN : IBqlField { }
[PXDBString(50, IsUnicode = true, IsKey = true)]
[PXUIField(DisplayName = "Investment EIN")]
public override string EIN { get; set; }
}
Please note, in the code snippet above I randomly chose string type for the EIN field. Ideally EIN field attributes should be close to identical in both xTACEntityMappingEIN and xTACEntityMappingEIN1, except the DisplayName property value for PXUIFieldAttribute.
The DAC Names need to be unique to "alias" a table. You cannot set an alias like you might use in SQL, but you can declare a new class inheriting the source class to give it a new "name" for the query. I had a similar Q&A here: Acumatica BQL Query with the same table more than once
In the inherited class you can change the display name of the fields as needed to "alias" a field name that repeats.
Here is a quick untested sample:
[Serializable]
public class xTACEntityMappingEINClient : xTACEntityMappingEIN
{
//Override field to set display name = "ClientEIN"
//[PXUIField(DisplayName = "ClientEIN")]
}
[Serializable]
public class xTACEntityMappingEINInvestment : xTACEntityMappingEIN
{
//Override field to set display name = "InvestmentEIN"
//[PXUIField(DisplayName = "InvestmentEIN")]
}
[PXSelector(typeof(Search2<xTACTaxDocument.iD,
InnerJoin<xTACEntityMappingEINClient,
On<xTACTaxDocument.clientEINID, Equal<xTACEntityMappingEINClient.iD>>,
InnerJoin<xTACEntityMappingEINInvestment ,
On<xTACTaxDocument.investmentEINID, Equal<xTACEntityMappingEINInvestment.iD>>>>>),
typeof(xTACTaxDocument.iD),
typeof(xTACTaxDocument.formID),
typeof(xTACTaxDocument.year),
typeof(xTACEntityMappingEINClient.eIN),
typeof(xTACEntityMappingEINInvestment .eIN))]

How to extract NIC information using Get-AzureRmVM cmdlet

I want to generate CSV file containing the VM names and the network interfaces that are attached to them. When I run the cmdlet, I see the following output in table format
ResourceGroupName Name Location VmSize OsType NIC
When I try to select only the NIC object using the command Get-AzureRmVM | select-object NIC the output is blank.
Can anyone guide me on how to filter out the NIC names and the VM names ?
Because NIC not the project in Get-AzureRmVm, so we can't use Get-AzureRmVM | select-object NIC to get NIC name:
PS D:\testdata> get-azurermvm | gm
TypeName: Microsoft.Azure.Commands.Compute.Models.PSVirtualMachineList
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToPSVirtualMachine Method Microsoft.Azure.Commands.Compute.Models.PSVirtualMachine ToPSVirtualMachine()
ToString Method string ToString()
AvailabilitySetReference Property Microsoft.Azure.Management.Compute.Models.SubResource AvailabilitySetReference {...
DiagnosticsProfile Property Microsoft.Azure.Management.Compute.Models.DiagnosticsProfile DiagnosticsProfile ...
DisplayHint Property Microsoft.Azure.Commands.Compute.Models.DisplayHintType DisplayHint {get;set;}
Extensions Property System.Collections.Generic.IList[Microsoft.Azure.Management.Compute.Models.Virtu...
HardwareProfile Property Microsoft.Azure.Management.Compute.Models.HardwareProfile HardwareProfile {get;s...
Id Property string Id {get;set;}
Identity Property Microsoft.Azure.Management.Compute.Models.VirtualMachineIdentity Identity {get;s...
InstanceView Property Microsoft.Azure.Management.Compute.Models.VirtualMachineInstanceView InstanceVie...
LicenseType Property string LicenseType {get;set;}
Location Property string Location {get;set;}
Name Property string Name {get;set;}
NetworkProfile Property Microsoft.Azure.Management.Compute.Models.NetworkProfile NetworkProfile {get;set;}
OSProfile Property Microsoft.Azure.Management.Compute.Models.OSProfile OSProfile {get;set;}
Plan Property Microsoft.Azure.Management.Compute.Models.Plan Plan {get;set;}
ProvisioningState Property string ProvisioningState {get;set;}
RequestId Property string RequestId {get;set;}
ResourceGroupName Property string ResourceGroupName {get;}
StatusCode Property System.Net.HttpStatusCode StatusCode {get;set;}
StorageProfile Property Microsoft.Azure.Management.Compute.Models.StorageProfile StorageProfile {get;set;}
Tags Property System.Collections.Generic.IDictionary[string,string] Tags {get;set;}
Type Property string Type {get;set;}
VmId Property string VmId {get;set;}
Can anyone guide me on how to filter out the NIC names and the VM
names ?
As a workaround, we can use this script to get the NIC name:
$a = get-azurermvm -ResourceGroupName jasonvm -Name jasonvm
$b = $a.NetworkProfile.NetworkInterfaces.id -split "/"
$nic = $b[-1]
$nic
Then we can use $nic to get the information about NIC, like this:
Get-AzureRmNetworkInterface -Name $nic -ResourceGroupName jasonvm

Db.LoadSelect throws NullReferenceException

Starting to pull my hair out over this, so thought I might try asking here.
I have this simple service:
public class EventService : Service
{
public object Get(GetEvents request)
{
return Db.LoadSelect<Event>();
}
}
The LoadSelect() throws a NullReferenceException.
I actually had it working perfectly earlier, but have no idea what is now causing it to throw the exception.
Have tracked it down to this line that is actually throwing the exception within ServiceStack (ServiceStack.OrmLite.Support.LoadList):
LoadList-NullReferenceException
But looking at the locals, everything seems fine to me. I mean, it can obviously get the data from the database, so that part is fine, the data is correct, and it even seems to resolve the ForeignKeys, and everything.
So what value it can't get, or isn't set, I have no idea :/
Any tips on how to troubleshoot this further would be great! =)
[EDIT1 - Here are the POCOs]
public class Event
{
[PrimaryKey]
public int Id { get; set; }
public int Timestamp { get; set; }
public int MessageId { get; set; }
[Reference]
public Message Message { get; }
}
public class Message
{
[PrimaryKey]
public int Id { get; set; }
public string Text { get; set; }
}
[EDIT2 - Findings after reading through the dup answer]
As mentioned in the initial question, the basic NullReferenceException troubleshooting has been performed, and I have dug as deep as I can into the ServiceStack framework to try and identify the culprit.
As far as I can see, all variables that are consumed by the call throwing the exception are okey (see screenshot below).
The only one (highlighted in the image below), should be handled by the ServiceStack OrmLite References API, but maybe someone more familier with the framework can comment, but it all looks good to me atleast...
LoadList-NullReferenceException-002
Perhaps I'm using the References API wrong?
The database structure is quite simple:
Event Table
| Event | CREATE TABLE `Event` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Timestamp` int(11) NOT NULL,
`MessageId` int(4) unsigned NOT NULL,
PRIMARY KEY (`Id`),
KEY `MessageId_FK` (`MessageId`),
CONSTRAINT `MessageId_FK` FOREIGN KEY (`MessageId`) REFERENCES `Message` (`Id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
mysql> SELECT * FROM Event;
+----+------------+-----------+
| Id | Timestamp | MessageId |
+----+------------+-----------+
| 1 | 1501026747 | 1 |
| 2 | 1501027047 | 1 |
+----+------------+-----------+
Message Table
| Message | CREATE TABLE `Message` (
`Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Text` varchar(255) NOT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `Id_UNIQUE` (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
mysql> SELECT * FROM Message;
+----+---------------------------------------------+
| Id | Text |
+----+---------------------------------------------+
| 1 | Someone is at the door! |
| 2 | 1 has acknowledged the notification. |
| 3 | 2 has acknowledged the notification. |
| 4 | 3 has acknowledged the notification. |
+----+---------------------------------------------+
Exception details
System.NullReferenceException occurred
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=ServiceStack.OrmLite
StackTrace:
at ServiceStack.OrmLite.Support.LoadList`2.SetRefSelfChildResults(FieldDefinition fieldDef, ModelDefinition refModelDef, FieldDefinition refSelf, IList childResults) in C:\TeamCity\buildAgent\work\12884bd5feef0ce7\src\ServiceStack.OrmLite\Support\LoadList.cs:line 154
To answer my own question, for some reason, I decided to remove the setter on the reference property of one of the POCOs (Event.Message).
[Reference]
public Message Message { get; }
Should of course have been (and was at some point, which is why it worked for a short time):
[Reference]
public Message Message { get; set; }
No wonder ServiceStack couldn't set the property, and then use it for the References API.

How to default an employeeid field to the current logged in user

I have a custom inquiry screen which uses an employeeid as the header filter field. What I'd like to do is default that employeeid field to the current logged in user, if possible. I've tried the following, but both give me a cast error (version 5.3.2562):
1.) [PXDBDefault(typeof(Search<EPEmployee.bAccountID,
Where<EPEmployee.bAccountID, Equal<Current<AccessInfo.userID>>>>))]
2.) [PXDBDefault(typeof(AccessInfo.userID))]
Here's the entire DAC code for the filter field:
#region EmployeeID
public abstract class employeeID : IBqlField
{
}
[PXInt]
[PXDBDefault(typeof(AccessInfo.userID))]
[PXUIField(DisplayName = "Employee ID")]
[PXSelector(typeof(Search<EPEmployee.bAccountID,
Where<EPEmployee.status, Equal<SetupTypes.active>>>),
typeof(EPEmployee.acctCD),
typeof(EPEmployee.acctName),
SubstituteKey = typeof(EPEmployee.acctCD),
DescriptionField = typeof(EPEmployee.acctName))]
public virtual int? EmployeeID { get; set; }
#endregion
What's the correct way to obtain this?
Update 6/30/2017:
After implementing the solution (using PXDefault instead of PXDBDefault) as follows:
[PXDefault(typeof(Search<EPEmployee.bAccountID,
Where<EPEmployee.bAccountID, Equal<Current<AccessInfo.userID>>>>))]
I get the following error:
We have a non filter field in a transaction able that defaults to the current employee.
This should work:
[PXDefault(typeof(Search<EPEmployee.bAccountID,
Where<EPEmployee.bAccountID, Equal<Current<AccessInfo.userID>>>>))]
Note that you do not want to use PXDBDefault for default values unless they are values coming from a parent DAC when linked with PXParent. Use PXDefault for defaults.
If this does not work in your filter, try PXUnboundDefault in place of PXDefault.
Edit 6/30/2017: new error might be on your selector. There is an employee selector already available. Remove your PXSelector and use [PXEPEmployeeSelector] on your field and see if this solves your error between uniqueidentifier and int
AccessInfo.userID seems to be a GUID. In order to avoid the casting error you need to relate AccessInfo.userID to EPEmployee.userID while searching for EPEmployee.bAccountID. Final code should look like this:
#region EmployeeID
public abstract class usrEmployeeID : IBqlField
{
}
[PXEPEmployeeSelector]
[PXUnboundDefault(typeof(Search<EPEmployee.bAccountID,
Where<EPEmployee.userID, Equal<Current<AccessInfo.userID>>>>))]
[PXUIField(DisplayName = "Employee ID")]
public virtual int? UsrEmployeeID { get; set; }
#endregion

Resources