我有一个Ticket实体:
public class Ticket
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Relation> RelatedTickets { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在Entity Framework Core中设置多对多自相关,因此我建立了两个一对多关系:
public class Relation
{
[Required, ForeignKey("TicketFrom")]
public int FromId { get; set; }
[Required, ForeignKey("TicketTo")]
public int ToId { get; set; }
public virtual Ticket TicketFrom { get; set; }
public virtual Ticket TicketTo { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用流畅的API创建关系:
builder.Entity<Relation>()
.HasKey(uc => new { uc.FromId, uc.ToId …Run Code Online (Sandbox Code Playgroud) 寻找Ef Core和Linq的一些帮助.让我们说我要求收到所有支持票,包括产品,公司等信息.这很简单,加入的东西:
select *
from Tickets T
left join Products P on T.ProductId = P.Id
left join ProductVersions PV on T.ProductVersionId = PV.Id
left join TicketTypes TT on T.TicketTypeId = TT.Id
left join TicketPriorities TP on T.TicketPriorityId = TP.Id
left join TicketStates TS on T.TicketStateId = TS.Id
left join AbpTenants A on T.TenantId = A.Id
left join AbpEditions E on A.EditionId = E.Id
left join TicketLinkedUsers TLU on TLU.TicketId = T.Id
left join TicketLinkTypes TLT on TLT.Id = TLU.TicketLinkTypeId
Run Code Online (Sandbox Code Playgroud)
但是我有最后4个连接的问题. …
我正在努力将数据库从Firebird移植到PostgreSQL,并且有许多与类型转换相关的错误.例如,让我们采取一个简单的功能:
CREATE OR REPLACE FUNCTION f_Concat3 (
s1 varchar, s2 varchar, s3 varchar
)
RETURNS varchar AS
$body$
BEGIN
return s1||s2||s3;
END;
$body$ LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER LEAKPROOF COST 100;
Run Code Online (Sandbox Code Playgroud)
由于Firebird对类型非常灵活,因此这些函数的调用方式不同:某些参数可能是另一种类型:整数/双精度/时间戳.当然在Postgres函数调用中f_Concat3 ('1', 2, 345.345)会导致如下错误:
函数f_Concat3(未知,整数,数字)未找到.
建议使用文档来使用如下的显式转换:
f_Concat3 ('1'::varchar, 2::varchar, 345.345::varchar)
Run Code Online (Sandbox Code Playgroud)
此外,我可以为所有可能发生的类型组合创建一个函数克隆,它将起作用.解决错误的示例:
CREATE OR REPLACE FUNCTION f_Concat3 (
s1 varchar, s2 integer, s3 numeric
)
RETURNS varchar AS
$body$
BEGIN
return s1::varchar||s2::varchar||s3::varchar;
END;
Run Code Online (Sandbox Code Playgroud)
然而,这是非常糟糕和丑陋的,它不适用于大功能.
重要提示:我们为所有数据库提供了一个通用代码库,并使用我们自己的语言来创建包含选择查询的应用程序对象(表单,报表等).在函数调用上使用显式强制转换是不可能的,因为我们将失去与其他DB的兼容性.
我感到困惑的是,整型参数不能被浇铸成numeric或double precision,或date/ …