Linq2DB并插入具有标识的新项目

时间:2018-12-21 16:17:29

标签: linq2db

我已经将代码的旧部分从EF移到了linq2db,当我不得不添加一个具有内部元素引用的标识的新项时,我必须执行以下代码

     if (axAnag == null)
     {
                    axAnag = new DataModels.AX();
                    var idAnag= context.InsertWithInt32Identity(axAnag);

                    axAnag.IdAnagrafica = idAnag;
     }

及下面的代码

        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;

对我来说不清楚的是为什么我必须添加id和整个引用的项目?

fk.AxAnagraficaAssicurati = axAnag;
fk.IdAnagrafica = axAnag.IdAnagrafica;

在我搭建的脚手架模型中

    [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; }

放一个够吗?并且与axAnag的插入有关,有没有一种我可以避免的方式

 var idAnag= context.InsertWithInt32Identity(axAnag);
 axAnag.IdAnagrafica = idAnag;

谢谢

1 个答案:

答案 0 :(得分:4)

我想说的是,您的问题来自尝试以与人们通常使用EF相同的方式使用linq2db,但是linq2db与数据模型之间没有如此紧密的联系(没有更改跟踪,没有引用的自动加载)。如果您要从应用程序的数据模型中分离数据库对象的映射,则使用linq2db会更容易。

关于第二个关于InsertWithIdentity的问题-该API不支持标识属性的设置,因此,如果需要使用生成的属性更新对象,则需要自己进行设置。您可以为此功能创建功能请求。

关于设置参考对象值和外键字段值问题。 linq2db中没有任何内容可告诉您进行任何设置-如果您进行了设置,则它是应用程序所需要的。 如果您想知道linq2db如何使用这两个属性,则:

  • FK字段属性是直接映射到FK表列和该属性在查询中使用的值,例如用于插入/更新操作。此外,此属性中还填充了select的值。

  • 关联属性具有两个作用。首先是在linq查询中定义联接操作的简便方法。其次是使用LoadWith方法在select中加载此属性的值。 linq2db不会将此属性的值用于其他任何用途。