Не определено равное между типом Nullable <Int32> и Int32

Я пишу скучное приложение, чтобы управлять пациентами и их историей клиники. Я использовал SQLite в сочетании с библиотеками DbLinq и утилитой генерации кода DbMetal. Вот два класса из сгенерированного кода, извлеченного из базовой базы данных:

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

    private int _isMarried;

    private string _lastName;

    private string _profession;

    private EntitySet _clinicCases;

    private EntitySet _patientsAddresses;

    private EntitySet _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 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(new Action(this.ClinicCases_Attach), new Action(this.ClinicCases_Detach));
        _patientsAddresses = new EntitySet(new Action(this.PatientsAddresses_Attach), new Action(this.PatientsAddresses_Detach));
        _patientsPhoneNumbers = new EntitySet(new Action(this.PatientsPhoneNumbers_Attach), new Action(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 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 ClinicCases
    {
        get
        {
            return this._clinicCases;
        }
        set
        {
            this._clinicCases = value;
        }
    }

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

    [Association(Storage="_patientsPhoneNumbers", OtherKey="PatientID", ThisKey="ID", Name="fk_PatientsPhoneNumbers_0")]
    [DebuggerNonUserCode()]
    public EntitySet 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 _patientID;

    private EntityRef _patients = new EntityRef();

    #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 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 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));
        }
    }
}

Я использую следующий код, чтобы добавить адрес пациенту:

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 - это экземпляр класса, который расширяет DataContext в сгенерированном коде. На SubmitChanges я получаю это исключение: "

Оператор равенства не определен между Nullable (Of Int32) и Int32. "

Сообщение не сообщается слово за словом, но смысл тот же. Трассировка стека указывает на код DbLinq, точнее на строку 709 исходного файла DbLinq.Data.Linq.DataContext.cs. Вы можете найти исходные файлы здесь:http://dblinq.codeplex.com/SourceControl/changeset/view/16800#314775 (в теле метода SetEntityRefQueries (объектный объект)). Я вижу, что проблема возникает при сравнении значения внешнего ключа с константой в дереве выражений, но я могуНе удалось получить другую информацию об этом. Можете ли вы помочь мне найти проблему?

N.B .: поле address.PatientID (внешний ключ) фактически установлено в правильное значение перед вызовом SubmitChanges.

 Totem24 сент. 2012 г., 22:02
Это's генерируется автоматически таким образом, но оно не может быть обычным целым числом, в противном случае вновь созданный приложением объект будет иметь недопустимый идентификатор (например, -1). Я думаю, что библиотека должна функционировать таким образом, потому что она автоматически проверяет, является ли id нулевым, и в этом случае она создает новый действительный идентификатор.
 Bobson24 сент. 2012 г., 22:08
Я использую LINQ-to-SQL, поэтому могуне обращайтесь к нему напрямую, но L2S нене использовать нулевые ключи, и это проходит - яЯ не уверен, как. Есть ли у вас какой-либо способ (сравнимый с L2S Designer) проверить сопоставление базы данных с классом, чтобы убедиться, что нет 'вариант, чтобы сопоставить его с необнуляемым?int
 Bobson24 сент. 2012 г., 20:50
Почему ваш столбец ID обнуляется?
 Totem25 сент. 2012 г., 11:47
Э-э ... есть другая проблема сейчас. Я храню объекты PatientAddress в ListView. Затем я извлекаю их для удаления, используя Database.Source.PatientAddress.DeleteOnSubmit (address) (и вызываю SubmitChanges только в следующей строке), но адреса выигралибыть удаленным из базы данных ...
 Bobson25 сент. 2012 г., 18:27
Я добавил ответ, чтобы вспомнить проблему первичного ключа (с изображениями) и прокомментировать проблему удаления. Можете ли вы добавить пример для этого?
 Totem25 сент. 2012 г., 11:10
Как ни удивительно, это сработало! Я заменил каждый экземпляр Nullable "int с int и где код использовал нуль в присваивании, я использовал -1. Я все еще должен понять, почему генератор создает код, основанный на обнуляемости, когдане нужны, и это приводит к таким исключениям.
 Totem24 сент. 2012 г., 22:27
Я должен переписать все свойства первичного ключа, но тогда яЯ должен был бы также изменить поведение EntitySet, потому что его метод add ожидает обнуляемый, я боюсь. Это было бы значительное усилие ...
 Bobson24 сент. 2012 г., 23:29
Случайно просматривая код, я нене вижу, где требуется обнуляемый первичныйключ, Объект, который вы передаетеAdd() может быть нулевым, но объекты всегда могут быть нулевыми. Аналогично, вSetEntityRefQueries() Функция, я вижу, где он проверяет значение внешнего ключа на ноль, но не первичный. Я могу быть совершенно неправ, потому что яобобщая мой опыт L2S и EF в другой ORM, но основываясь надокументацияЯопределенно буду искатьCanBeNull собственность на ваш ключ.

Ответы на вопрос(2)

Ты пробовал:address.Patient = currentPatient вместо: ?currentPatient.Addresses.Add(address)

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

Database.Source.PatientsAddresses.InsertOnSubmit(address);
Database.Source.SubmitChanges();
 Totem24 сент. 2012 г., 22:03
Я пытался, но этоточно так же.
Решение Вопроса

Как я уже упоминал в комментарии выше (который яЯ повторяю здесь, чтобы я мог связать изображения), ваш первичный ключ не должен быть обнуляемым. В вашем отображении должно быть свойство, которое вы можете изменить, чтобы установить его, хотя я нене могу использовать DbLinq, так что я могуЯ не могу дать вам скриншот. Вместо этого здесь он находится в конструкторе DBML LINQ-2-SQL (слева) и в конструкторе EDMX Entity Framework (справа).

 Я'

Я не так уверен насчет вашей проблемы с удалением - мне кажется, это должно сработать. Можете ли вы отредактировать свой вопрос, чтобы включить весь блок кода удаления? Как предварительное предположение, вылибо создаете новый объект (вместо загрузки одного), а затем пытаетесь удалить его, либо выповторное удаление ассоциации без удаления объекта.

Как правило, я никогда не удаляю из базы данных, когда я могу избежать этого - я просто отмечаю неактивным. Это'гораздо легче "восстановить» сюда.

 Totem25 сент. 2012 г., 22:16
Я создал новый вопрос:stackoverflow.com/questions/12583839/...

Ваш ответ на вопрос