Исключение LINQ: «Оператор INSERT вступил в конфликт с ограничением FOREIGN KEY», боясь отношений! - PullRequest
0 голосов
/ 07 декабря 2010

Я получил исключение, как только я вызываю SubmitChanges ()
Назначенные идентификаторы действительны и уже созданы в базе данных
«FirstLevelReprotDataSource» относится к «ReportDataSource» Классу
Все данные взяты из одного и того же datacontext

alt text

GroupingDataMember gdm = new GroupingDataMember();
gdm.DataMemberID = 87;
gdm.FirstLevelDataSourceID = 61;
gdm.CreatedBy = "";
gdm.CreationDate = DateTime.Now;
SelectedReportDataSource.FirstLevelReportDataSource.GroupingDataMembers.Add(gdm);

Оператор INSERT конфликтует с ограничение FOREIGN KEY "FK_GroupingField_ReportDataSource". Конфликт произошел в базе данных "HumanResourcesDocumentManagement", таблица "dbo.ReportDataSource", столбец 'Я БЫ'. Заявление было прекращено.

Есть предложения?

[Association(Name="ReportDataSource_GroupingDataMember", Storage="_FirstLevelReportDataSource", ThisKey="FirstLevelDataSourceID", OtherKey="ID", IsForeignKey=true)]
public ReportDataSource FirstLevelReportDataSource
{
    get
    {
        return this._FirstLevelReportDataSource.Entity;
    }
    set
    {
    ReportDataSource previousValue = this._FirstLevelReportDataSource.Entity;
    if (((previousValue != value) 
                || (this._FirstLevelReportDataSource.HasLoadedOrAssignedValue == false)))
    {
        this.SendPropertyChanging();
        if ((previousValue != null))
        {
            this._FirstLevelReportDataSource.Entity = null;
            previousValue.GroupingDataMembers.Remove(this);
        }
        this._FirstLevelReportDataSource.Entity = value;
        if ((value != null))
        {
            value.GroupingDataMembers.Add(this);
            this._FirstLevelDataSourceID = value.ID;
        }
        else
        {
            this._FirstLevelDataSourceID = default(int);
        }
        this.SendPropertyChanged("FirstLevelReportDataSource");
    }
    }
}

Ответы [ 2 ]

0 голосов
/ 12 декабря 2010

Поскольку вы явно устанавливаете идентификаторы в своем примере, почему бы не добавить созданный вами объект непосредственно в таблицу GroupingDataMember контекста, а затем отправить изменения в базу данных?В любом случае, посмотрите на SQL, сгенерированный LINQ, чтобы получить лучшее представление о том, что на самом деле происходит в БД.

0 голосов
/ 07 декабря 2010

Прежде всего, так как вы вызываете SelectedReportDataSource.FirstLevelReportDataSource.GroupingDataMembers.Add (gdm), вам не нужно устанавливать gdm.FirstLevelDataSourceID = 61.

Во-вторых, старайтесь не устанавливать поля идентификаторов по значению. Лучше придерживаться внешнего ключа, говоря, что entity.ForeignKeyProperty = dataContext.ForeignKeyTableObjects.SingleOrDefault (o => o.ID.Equals (50)); или любой другой идентификатор. Таким образом, вы привязываете ОБЪЕКТ к сущности, а не идентификатор к полю сущности.

В-третьих, убедитесь, что эти идентификаторы существуют в db-87, 61 и т. Д. И проверьте, требуется ли gdm.ReportDataSource. Если это так, вы не устанавливаете его выше. Это может привести к сбою.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...