###### tags: `DotNet` `Entity Framework`
# EF Has no parameterless construct issue
## 情境
近期在某專案在Service Layer使用Persistence Layer EF6 Entity時,特定根據情境宣告需注入參數的建構子。情境如下
### Entity Model
```csharp=
/// <summary>
/// Cut channel mark (3D Channel排序)
/// </summary>
[Table(nameof(ProductInfo_CutChMark))]
public class ProductInfo_CutChMark : BaseEntityModel
{
/// <summary>
/// Serial Number Ex:60A0MN8G0006
/// </summary>
[Key, Column(Order = 1), MaxLength(20)]
public string SN { get; set; }
/// <summary>
/// Product Type Ex:118X118
/// </summary>
[Column(Order = 2), MaxLength(20), Required]
public string ProductType { get; set; }
/// <summary>
/// ALIGN: Align Stage
/// PRE:將完成ALIGN的BAREBONE裝入HOUSING後的檢查
/// 空值: Calibration
/// FINAL:指完成CONNECTOR製作後的最後測試
/// </summary>
[Key, Column(Order = 3), MaxLength(20)]
public string UsageStage { get; set; }
/// <summary>
/// 實體Channel編號 1,2,3,4,5
/// </summary>
[Column(Order = 4), MaxLength(500)]
public string Physical_ChNo { get; set; }
/// <summary>
/// 邏輯In Channel編號 0,1,2.. (0表不用)
/// </summary>
[Column(Order = 5), MaxLength(500)]
public string Logic_InChNo { get; set; }
/// <summary>
/// 邏輯Out Channel編號 0,1,2.. (0表不用)
/// </summary>
[Column(Order = 6), MaxLength(500)]
public string Logic_OutChNo { get; set; }
/// <summary>
/// MEMS In Chip Status (Normal, Spare, Reserved, Cutoff) -1,2,-1,-1,2 0,1,2,0..
/// </summary>
[Column(Order = 7), MaxLength(500)]
public string Status_InCh { get; set; }
/// <summary>
/// MEMS Out Chip Status (Normal, Spare, Reserved, Cutoff) -1,2,-1,-1,2 0,1,2,0..
/// </summary>
[Column(Order = 8), MaxLength(500)]
public string Status_OutCh { get; set; }
/// <summary>
/// Construct
/// </summary>
/// <param name="sn">Serial Number Ex:60A0MN8G0006</param>
/// <param name="productType">Product Type Ex:118X118</param>
public ProductInfo_CutChMark(string sn, string productType)
{
SN = sn;
ProductType = productType;
}
}
```
## 錯誤訊息
如情境所述,此時在使用ProductInfo_CutChMark EF Model時需注入SN與ProductType 兩個參數。結果在使用DBContext時跳出下述錯誤
> has no parameterless construct

## 解決方法
基本上Persistence Layer大部分狀況都是使用PO Model,理論上可以不用宣告可注入的建構子設定。稍微查一下專案中我使用此EF Model的實際狀況,確實有落實基本的三層設計,只是Service Layer使用Model下意識覺得SN跟ProductType為必須參數做了這個設定。故
把需注入的建構子拿掉就正常了,又或是可以宣告一個空的建構子。但設計上應該不會這樣做,故前者的方法還是比較好。從這錯誤大致也知道EF Framework在Persistence Layer某種程度會希望設計者能落實PO設計。所以我覺得較好的方式可以用Mapping方式去Mapping BO與PO(Net與Net Core則使用AutoMapper)。