我已将旧代码部分从 EF 移至 linq2db,当我必须添加一个具有内部元素引用的标识的新项目时,我必须执行以下代码
if (axAnag == null)
{
axAnag = new DataModels.AX();
var idAnag= context.InsertWithInt32Identity(axAnag);
axAnag.IdAnagrafica = idAnag;
}
Run Code Online (Sandbox Code Playgroud)
和下面的代码
fk.AxAnagraficaAssicurati = axAnag;
fk.StatusProtocollo = statusProtocollo;
fk.DataEsclusione = newAnagrafica.DataEsclusione ?? condizione.DataAnnullamento;
fk.DataInclusione = newAnagrafica.DataInclusione;
fk.DerogaEta = newAnagrafica.DerogaEta;
fk.ProgrCategoria = condizione.ProgessivoCategoria;
fk.IdCondizione = condizione.Id;
fk.IdCategoria = condizione.IdCategoria;
fk.DataOperazioneInclusione = DateTime.Now;
fk.HYPER = newAnagrafica.HyperService;
//GPA ticket 2017-0017962
fk.LimiteEtaSuperato = newAnagrafica.IsLimiteEtaSuperato;
//GPA cr24
fk.FlagConteggioRegolazionePremio = newAnagrafica.FlagConteggioRegolazionePremio;
fk.IdAnagrafica = axAnag.IdAnagrafica;
Run Code Online (Sandbox Code Playgroud)
我不太清楚的是为什么我必须添加 id 和整个引用的项目?
fk.AxAnagraficaAssicurati = axAnag;
fk.IdAnagrafica = axAnag.IdAnagrafica;
Run Code Online (Sandbox Code Playgroud)
在脚手架模型中,我
[Association(ThisKey = "IdAnagrafica", OtherKey = "IdAnagrafica", CanBeNull = true, Relationship = Relationship.ManyToOne, KeyName = "FK_BENEFIT_FK_ANAGRAFICA_ASS_POLIZZE_ANAGRAFICA", BackReferenceName = "BenefitFkAnagraficaAssPolizze")]
public AxAnagraficaAssicurati AxAnagraficaAssicurati { get; set; }
Run Code Online (Sandbox Code Playgroud)
放一个还不够吗?并且还与插入有关,axAnag我可以避免这样做
var idAnag= context.InsertWithInt32Identity(axAnag);
axAnag.IdAnagrafica = idAnag;
Run Code Online (Sandbox Code Playgroud)
谢谢
小智 6
我想说的是,您的问题来自尝试以人们通常使用 EF 的方式使用 linq2db,但 linq2db 与数据模型没有如此紧密的耦合(没有更改跟踪,没有自动加载引用)。如果您将数据库对象的映射与应用程序的数据模型分开,那么使用 linq2db 会更容易。
关于您的第二个问题InsertWithIdentity- 此 API 不支持身份属性的设置,因此如果您需要使用生成的属性更新对象,则需要自己进行设置。您可以为此类功能创建功能请求。
关于设置引用对象值和外键字段值的问题。linq2db 中没有任何内容会告诉您设置其中任何一个 - 如果您这样做,那么它就是您的应用程序所需要的。如果您想知道 linq2db 如何使用这两个属性,那么:
FK 字段属性是直接映射到 FK 表列和查询中使用的此属性的值,例如用于插入/更新操作。此属性也填充了选择值。
关联属性有两个作用。首先是在 linq 查询中定义连接操作的简单方法。其次是在 select usingLoadWith方法上加载此属性的值。linq2db 不要将此属性的值用于其他任何用途。