Linq to sql 在Linq2SQL中创建条件关系

Linq to sql 在Linq2SQL中创建条件关系,linq-to-sql,Linq To Sql,我正在对一个旧的数据库系统使用linq2sql。在这个系统中有三个表:发票、用户和注册用户。发票表有一个UID字段,该字段通常引用用户表上的UID键。但是,它还有一个IsSignup位字段,指示UID字段应该引用SignupUsers表上的UID键 我并不真正关心与SignupUsers表的关系,但我们确实存在一个问题,即在使用linq2sql实体时很容易忘记检查IsSignup值。我希望实体中的发票->用户关系以IsSignup位字段为条件 我试过几种方法。首先,我尝试设置onload: pu

我正在对一个旧的数据库系统使用linq2sql。在这个系统中有三个表:发票、用户和注册用户。发票表有一个UID字段,该字段通常引用用户表上的UID键。但是,它还有一个IsSignup位字段,指示UID字段应该引用SignupUsers表上的UID键

我并不真正关心与SignupUsers表的关系,但我们确实存在一个问题,即在使用linq2sql实体时很容易忘记检查IsSignup值。我希望实体中的发票->用户关系以IsSignup位字段为条件

我试过几种方法。首先,我尝试设置onload:

public partial class Invoice
{
    partial void OnLoaded()
    {
        if (IsSignup)
        {
            InvoiceUser = null;
        }
    }
}
这失败了,因为它试图在保存发票时将UID字段实际设置为null,而我们无法这样做

我尝试了DataLoadOptions,但也找不到一种方法来实现它

我可以只更改InvoiceUsers属性getter,但是每次更改dbml时它都会被覆盖


我只是运气不好吗

我会在这里提出我的解决方案,但还是希望有人能想出更好的办法

我正在使用生成代码。我进入了这个特定的.dbml文件的.tt文件,找到了为关系生成属性的部分。然后,我侵入了一条if语句,该语句修改了应用于此特定关系的属性:

    <#=code.Format(association.MemberAttributes)#><#=association.Type.Name#> <#=association.Member#>
    {
        get {
            <#if(association.Name == "InvoiceUser_Invoice"){#>
                            //HACK IN THE .TT FILE TO ALWAYS INCLUDE THIS CONDITIONAL RELATIONSHIP
            if(IsSignup){return null;}
            <#}#>
            <#if (needsSerializationFlag && serialization) {#>
            if (serializing && !<#=association.Storage#>.HasLoadedOrAssignedValue) {
                return null;
            }
            <#}#>
            return <#=association.Storage#>.Entity;
        }
因此,这仍然是一个令人讨厌的攻击,但它至少阻止了对.dbml文件的更改删除所需的条件关系

    [Association(Name=@"InvoiceUser_Invoice", Storage=@"_InvoiceUser", ThisKey=@"UID", OtherKey=@"UID", IsForeignKey=true)]
    public InvoiceUser InvoiceUser
    {
        get {
            //HACK IN THE .TT FILE TO ALWAYS INCLUDE THIS CONDITIONAL RELATIONSHIP
                            if(IsSignup){return null;}
                            return _InvoiceUser.Entity;
        }
        set {
            InvoiceUser previousValue = _InvoiceUser.Entity;
            if ((previousValue != value) || (!_InvoiceUser.HasLoadedOrAssignedValue)) {
                SendPropertyChanging();
                if (previousValue != null) {
                    _InvoiceUser.Entity = null;
                    previousValue.Invoices.Remove(this);
                }
                _InvoiceUser.Entity = value;
                if (value != null) {
                    value.Invoices.Add(this);
                    _UID = value.UID;
                }
                else {
                    _UID = default(int);
                }
                SendPropertyChanged("InvoiceUser");
            }
        }
    }