Gleich ist nicht zwischen dem Typ Nullable <Int32> und Int32 definiert

Ich schreibe eine langweilige Bewerbung, um Patienten und ihre Krankengeschichte zu verwalten. Ich habe SQLite in Kombination mit DbLinq-Bibliotheken und dem Dienstprogramm zur Codegenerierung von DbMetal verwendet. Hier sind zwei Klassen aus dem generierten Code, der aus der zugrunde liegenden Datenbank extrahiert wurde:

[Table(Name="main.Patients")]
public partial class Patient : System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
{

    private static System.ComponentModel.PropertyChangingEventArgs emptyChangingEventArgs = new System.ComponentModel.PropertyChangingEventArgs("");

    private long _birthday;

    private string _firstName;

    private int _hasChildren;

    private System.Nullable<int> _id;

    private int _isMarried;

    private string _lastName;

    private string _profession;

    private EntitySet<ClinicCase> _clinicCases;

    private EntitySet<PatientAddress> _patientsAddresses;

    private EntitySet<PatientPhoneNumber> _patientsPhoneNumbers;

    #region Extensibility Method Declarations
    partial void OnCreated();

    partial void OnBirthdayChanged();

    partial void OnBirthdayChanging(long value);

    partial void OnFirstNameChanged();

    partial void OnFirstNameChanging(string value);

    partial void OnHasChildrenChanged();

    partial void OnHasChildrenChanging(int value);

    partial void OnIDChanged();

    partial void OnIDChanging(System.Nullable<int> value);

    partial void OnIsMarriedChanged();

    partial void OnIsMarriedChanging(int value);

    partial void OnLastNameChanged();

    partial void OnLastNameChanging(string value);

    partial void OnProfessionChanged();

    partial void OnProfessionChanging(string value);
    #endregion


    public Patient()
    {
        _clinicCases = new EntitySet<ClinicCase>(new Action<ClinicCase>(this.ClinicCases_Attach), new Action<ClinicCase>(this.ClinicCases_Detach));
        _patientsAddresses = new EntitySet<PatientAddress>(new Action<PatientAddress>(this.PatientsAddresses_Attach), new Action<PatientAddress>(this.PatientsAddresses_Detach));
        _patientsPhoneNumbers = new EntitySet<PatientPhoneNumber>(new Action<PatientPhoneNumber>(this.PatientsPhoneNumbers_Attach), new Action<PatientPhoneNumber>(this.PatientsPhoneNumbers_Detach));
        this.OnCreated();
    }

    [Column(Storage="_birthday", Name="Birthday", DbType="integer", AutoSync=AutoSync.Never, CanBeNull=false)]
    [DebuggerNonUserCode()]
    public long BirthdayBinaryDate
    {
        get
        {
            return this._birthday;
        }
        set
        {
            if ((_birthday != value))
            {
                this.OnBirthdayChanging(value);
                this.SendPropertyChanging();
                this._birthday = value;
                this.SendPropertyChanged("Birthday");
                this.OnBirthdayChanged();
            }
        }
    }

    [Column(Storage="_firstName", Name="FirstName", DbType="text", AutoSync=AutoSync.Never, CanBeNull=false)]
    [DebuggerNonUserCode()]
    public string FirstName
    {
        get
        {
            return this._firstName;
        }
        set
        {
            if (((_firstName == value) 
                        == false))
            {
                this.OnFirstNameChanging(value);
                this.SendPropertyChanging();
                this._firstName = value;
                this.SendPropertyChanged("FirstName");
                this.OnFirstNameChanged();
            }
        }
    }

    [Column(Storage="_hasChildren", Name="HasChildren", DbType="integer", AutoSync=AutoSync.Never, CanBeNull=false)]
    [DebuggerNonUserCode()]
    public int HasChildren
    {
        get
        {
            return this._hasChildren;
        }
        set
        {
            if ((_hasChildren != value))
            {
                this.OnHasChildrenChanging(value);
                this.SendPropertyChanging();
                this._hasChildren = value;
                this.SendPropertyChanged("HasChildren");
                this.OnHasChildrenChanged();
            }
        }
    }

    [Column(Storage="_id", Name="ID", DbType="integer", IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    [DebuggerNonUserCode()]
    public System.Nullable<int> ID
    {
        get
        {
            return this._id;
        }
        set
        {
            if ((_id != value))
            {
                this.OnIDChanging(value);
                this.SendPropertyChanging();
                this._id = value;
                this.SendPropertyChanged("ID");
                this.OnIDChanged();
            }
        }
    }

    [Column(Storage="_isMarried", Name="IsMarried", DbType="integer", AutoSync=AutoSync.Never, CanBeNull=false)]
    [DebuggerNonUserCode()]
    public int IsMarried
    {
        get
        {
            return this._isMarried;
        }
        set
        {
            if ((_isMarried != value))
            {
                this.OnIsMarriedChanging(value);
                this.SendPropertyChanging();
                this._isMarried = value;
                this.SendPropertyChanged("IsMarried");
                this.OnIsMarriedChanged();
            }
        }
    }

    [Column(Storage="_lastName", Name="LastName", DbType="text", AutoSync=AutoSync.Never, CanBeNull=false)]
    [DebuggerNonUserCode()]
    public string LastName
    {
        get
        {
            return this._lastName;
        }
        set
        {
            if (((_lastName == value) 
                        == false))
            {
                this.OnLastNameChanging(value);
                this.SendPropertyChanging();
                this._lastName = value;
                this.SendPropertyChanged("LastName");
                this.OnLastNameChanged();
            }
        }
    }

    [Column(Storage="_profession", Name="Profession", DbType="text", AutoSync=AutoSync.Never)]
    [DebuggerNonUserCode()]
    public string Profession
    {
        get
        {
            return this._profession;
        }
        set
        {
            if (((_profession == value) 
                        == false))
            {
                this.OnProfessionChanging(value);
                this.SendPropertyChanging();
                this._profession = value;
                this.SendPropertyChanged("Profession");
                this.OnProfessionChanged();
            }
        }
    }

    #region Children
    [Association(Storage="_clinicCases", OtherKey="PatientID", ThisKey="ID", Name="fk_ClinicCases_0")]
    [DebuggerNonUserCode()]
    public EntitySet<ClinicCase> ClinicCases
    {
        get
        {
            return this._clinicCases;
        }
        set
        {
            this._clinicCases = value;
        }
    }

    [Association(Storage="_patientsAddresses", OtherKey="PatientID", ThisKey="ID", Name="fk_PatientsAddresses_0")]
    [DebuggerNonUserCode()]
    public EntitySet<PatientAddress> Addresses
    {
        get
        {
            return this._patientsAddresses;
        }
        set
        {
            this._patientsAddresses = value;
        }
    }

    [Association(Storage="_patientsPhoneNumbers", OtherKey="PatientID", ThisKey="ID", Name="fk_PatientsPhoneNumbers_0")]
    [DebuggerNonUserCode()]
    public EntitySet<PatientPhoneNumber> PhoneNumbers
    {
        get
        {
            return this._patientsPhoneNumbers;
        }
        set
        {
            this._patientsPhoneNumbers = value;
        }
    }
    #endregion

    public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging;

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected virtual void SendPropertyChanging()
    {
        System.ComponentModel.PropertyChangingEventHandler h = this.PropertyChanging;
        if ((h != null))
        {
            h(this, emptyChangingEventArgs);
        }
    }

    protected virtual void SendPropertyChanged(string propertyName)
    {
        System.ComponentModel.PropertyChangedEventHandler h = this.PropertyChanged;
        if ((h != null))
        {
            h(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }

    #region Attachment handlers
    private void ClinicCases_Attach(ClinicCase entity)
    {
        this.SendPropertyChanging();
        entity.Patient = this;
    }

    private void ClinicCases_Detach(ClinicCase entity)
    {
        this.SendPropertyChanging();
        entity.Patient = null;
    }

    private void PatientsAddresses_Attach(PatientAddress entity)
    {
        this.SendPropertyChanging();
        entity.Patient = this;
    }

    private void PatientsAddresses_Detach(PatientAddress entity)
    {
        this.SendPropertyChanging();
        entity.Patient = null;
    }

    private void PatientsPhoneNumbers_Attach(PatientPhoneNumber entity)
    {
        this.SendPropertyChanging();
        entity.Patient = this;
    }

    private void PatientsPhoneNumbers_Detach(PatientPhoneNumber entity)
    {
        this.SendPropertyChanging();
        entity.Patient = null;
    }
    #endregion
}

[Table(Name="main.PatientsAddresses")]
public partial class PatientAddress : System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
{

    private static System.ComponentModel.PropertyChangingEventArgs emptyChangingEventArgs = new System.ComponentModel.PropertyChangingEventArgs("");

    private string _address;

    private string _domicileStatus;

    private System.Nullable<int> _patientID;

    private EntityRef<Patient> _patients = new EntityRef<Patient>();

    #region Extensibility Method Declarations
    partial void OnCreated();

    partial void OnAddressChanged();

    partial void OnAddressChanging(string value);

    partial void OnDomicileStatusChanged();

    partial void OnDomicileStatusChanging(string value);

    partial void OnPatientIDChanged();

    partial void OnPatientIDChanging(System.Nullable<int> value);
    #endregion


    public PatientAddress()
    {
        this.OnCreated();
    }

    [Column(Storage="_address", Name="Address", DbType="text", IsPrimaryKey=true, AutoSync=AutoSync.Never)]
    [DebuggerNonUserCode()]
    public string Address
    {
        get
        {
            return this._address;
        }
        set
        {
            if (((_address == value) 
                        == false))
            {
                this.OnAddressChanging(value);
                this.SendPropertyChanging();
                this._address = value;
                this.SendPropertyChanged("Address");
                this.OnAddressChanged();
            }
        }
    }

    [Column(Storage="_domicileStatus", Name="DomicileStatus", DbType="text", AutoSync=AutoSync.Never)]
    [DebuggerNonUserCode()]
    public string DomicileStatus
    {
        get
        {
            return this._domicileStatus;
        }
        set
        {
            if (((_domicileStatus == value) 
                        == false))
            {
                this.OnDomicileStatusChanging(value);
                this.SendPropertyChanging();
                this._domicileStatus = value;
                this.SendPropertyChanged("DomicileStatus");
                this.OnDomicileStatusChanged();
            }
        }
    }

    [Column(Storage="_patientID", Name="PatientID", DbType="integer", IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.Never)]
    [DebuggerNonUserCode()]
    public System.Nullable<int> PatientID
    {
        get
        {
            return this._patientID;
        }
        set
        {
            if ((_patientID != value))
            {
                if (_patients.HasLoadedOrAssignedValue)
                {
                    throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
                }
                this.OnPatientIDChanging(value);
                this.SendPropertyChanging();
                this._patientID = value;
                this.SendPropertyChanged("PatientID");
                this.OnPatientIDChanged();
            }
        }
    }

    #region Parents
    [Association(Storage="_patients", OtherKey="ID", ThisKey="PatientID", Name="fk_PatientsAddresses_0", IsForeignKey=true)]
    [DebuggerNonUserCode()]
    public Patient Patient
    {
        get
        {
            return this._patients.Entity;
        }
        set
        {
            if (((this._patients.Entity == value) 
                        == false))
            {
                if ((this._patients.Entity != null))
                {
                    Patient previousPatients = this._patients.Entity;
                    this._patients.Entity = null;
                    previousPatients.Addresses.Remove(this);
                }
                this._patients.Entity = value;
                if ((value != null))
                {
                    value.Addresses.Add(this);
                    _patientID = value.ID;
                }
                else
                {
                    _patientID = null;
                }
            }
        }
    }
    #endregion

    public event System.ComponentModel.PropertyChangingEventHandler PropertyChanging;

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected virtual void SendPropertyChanging()
    {
        System.ComponentModel.PropertyChangingEventHandler h = this.PropertyChanging;
        if ((h != null))
        {
            h(this, emptyChangingEventArgs);
        }
    }

    protected virtual void SendPropertyChanged(string propertyName)
    {
        System.ComponentModel.PropertyChangedEventHandler h = this.PropertyChanged;
        if ((h != null))
        {
            h(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

Ich verwende den folgenden Code, um einem Patienten eine Adresse hinzuzufügen:

PatientAddress address = new PatientAddress();
address.Address = txtAddress.Text;
address.DomicileStatus = cmbDomicileStatus.Text;
currentPatient.Addresses.Add(address);

Database.Source.PatientsAddresses.InsertOnSubmit(address);
Database.Source.SubmitChanges();

Database.Source ist eine Instanz der Klasse, die DataContext im generierten Code erweitert. Bei SubmitChanges erhalte ich diese Ausnahme:

"Der Gleichheitsoperator ist zwischen Nullable (Of Int32) und Int32 nicht definiert."

Die Nachricht wird nicht wortweise gemeldet, aber die Bedeutung ist dieselbe. Der Stack-Trace verweist auf DbLinq-Code, genauer gesagt auf Zeile 709 der Quelldatei DbLinq.Data.Linq.DataContext.cs. Die Quelldateien finden Sie hier:http://dblinq.codeplex.com/SourceControl/changeset/view/16800#314775 (Unter dem Body der Methode SetEntityRefQueries (Objektentität)). Ich sehe, dass das Problem auftritt, wenn ein Fremdschlüsselwert mit einer Konstanten in einem Ausdrucksbaum verglichen wird, aber es ist mir nicht gelungen, andere Informationen darüber zu erhalten. Können Sie mir helfen, das Problem zu finden?

N.B .: Das Feld address.PatientID (Fremdschlüssel) wird vor dem Aufruf von SubmitChanges tatsächlich auf den richtigen Wert gesetzt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage