在我們的WebApi項目中,我們使用EF CodeFirst方法。我們還使用兩種類型的數據庫:SQL Server和MySQL。所有的表都有字段ID
,但是在SQL Server數據庫中這個字段有int
數據類型,在MySQL數據庫中這個字段是char(36)
並且包含GUID
。自定義值類型,EF代碼優先和路由
爲了解決我創建了一個自定義的值類型一樣IdType
,並改變了所有的模式類使用該類型insted的int
問題:
public class Document
{
public IdType ID { get; set; }
public string DocumentNm { get; set; }
...
}
然後我配置的DbContext(如SQL Server)的
modelBuilder.Properties<IdType>().Configure(c => c.HasColumnType("int"));
...並改變存儲庫:
public interface IRepository<T> where T : IEntity
{
IQueryable<T> GetAll();
T GetById(IdType id);
...
}
之後,當我嘗試去例如http://localhost:7081/api/Document
,它給我一個錯誤:
Multiple actions were found that match the request: \r\nGet on type WebUI.Controllers.API.DocumentController\r\nGetById on type WebUI.Controllers.API.DocumentController
我使用路由的默認設置。下面是從DocumentController [HttpGet]
方法:
public HttpResponseMessage Get() { ... }
public HttpResponseMessage GetById(IdType id) { ... }
我怎樣才能解決這個問題?這可能是造成IdType
錯誤的原因嗎?
P.S.我爲here所描述的int值創建了IdType。如果我必須添加更多信息,請告訴我。
UPDATE
DocumentController:
public HttpResponseMessage GetById(IdType id)
{
var entity = repository.GetById(id);
if (entity == null)
{
return ErrorMsg(HttpStatusCode.NotFound, string.Format("No {0} with ID = {1}", GenericTypeName, id););
}
return Request.CreateResponse(HttpStatusCode.OK, entity);
}
我的資料庫:
public virtual T GetById(IdType id)
{
return GetAll().FirstOrDefault(x => x.ID == id);
}
public virtual IQueryable<T> GetAll()
{
return entities = context.Set<T>();
}
您可以添加IdType類型和GetById方法嗎? – ivamax9
@Chase我更新了問題並添加了GetById方法。 IdType有更多的代碼,你可以在[GitHub]中看到它(https://github.com/Marusyk/SmartVillageOnline/blob/IdType/Domain/Concrete/IdType.cs) – Marusyk
好的,所以目前的代碼是好的,你可以添加repository.GetById? – ivamax9