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