Ответ 1
Возможно ли, что вы определили плохое отношение столбцов между вашими таблицами? разные столбцы и один были установлены как автономические.
Это случилось со мной.
Я получаю эту ошибку при записи в базу данных:
Зависимое свойство в ссылочной привязке отображается на созданный магазином столбец. Столбец: "PaymentId".
public bool PayForItem(int terminalId, double paymentAmount,
eNums.MasterCategoryEnum mastercategoryEnum, int CategoryId, int CategoryItemId)
{
using (var dbEntities = new DatabaseAccess.Schema.EntityModel())
{
int pinnumber = 0;
long pinid = 1; //getPinId(terminalId,ref pinnumber) ;
var payment = new DatabaseAccess.Schema.Payment();
payment.CategoryId = CategoryId;
payment.ItemCategoryId = CategoryItemId;
payment.PaymentAmount = (decimal)paymentAmount;
payment.TerminalId = terminalId;
payment.PinId = pinid;
payment.HSBCResponseCode = "";
payment.DateActivated = DateTime.Now;
payment.PaymentString = "Payment";
payment.PromotionalOfferId = 1;
payment.PaymentStatusId = (int)eNums.PaymentStatus.Paid;
//payment.PaymentId = 1;
dbEntities.AddToPayments(payment);
dbEntities.SaveChanges();
}
return true;
}
Схема:
Возможно ли, что вы определили плохое отношение столбцов между вашими таблицами? разные столбцы и один были установлены как автономические.
Это случилось со мной.
Эта ошибка говорит о том, что вы используете неподдерживаемое отношение или у вас есть ошибка в вашем сопоставлении. Вероятно, ваш код абсолютно не связан с ошибкой.
Ошибка означает, что у вас есть некоторая взаимосвязь между объектами, где свойство внешнего ключа в зависимом объекте определяется как сгенерированное хранилище. Сохраненные сгенерированные свойства заполняются в базе данных. EF не поддерживает свойства, созданные магазином, как внешние ключи (а также вычисленные свойства в первичных ключах).
У меня была та же проблема. Основываясь на ответах, представленных здесь, я смог отслеживать их и решать, но у меня была странная проблема, описанная ниже - это может помочь кому-то в будущем.
В моих зависимых таблицах столбцы внешнего ключа были установлены в StoreGeneratedPattern = "Identity". Мне пришлось изменить его на "Нет". К сожалению, делать это внутри дизайнера не получилось.
Я просмотрел созданный конструктором XML (SSDL), и эти свойства все еще были там, поэтому я удалил их вручную. Я также должен был исправить столбцы в базе данных (удалить Identity (1,1) из CREATE TABLE SQL)
После этого проблема исчезла.
У меня была такая же проблема, и после некоторого поиска в дизайне таблицы на сервере sql, я обнаружил, что по ошибке я установил первичный ключ таблицы также как внешний ключ.
На этом рисунке вы можете видеть, что JobID является первичным ключом таблицы, но также и ошибочным внешним ключом.
Повторно проверьте взаимосвязь между Платежом и другими таблицами/сущностями. Включая те, которые не должны содержать PaymentId, потому что там, где проблема, скорее всего, скрывается.
При создании внешних ключей в SQL Server Management Studio первичный ключ по умолчанию используется, и это значение по умолчанию возвращается, когда родительская таблица изменена, поэтому будьте осторожны, чтобы изменить значения в правильном порядке в окне "Таблицы и столбцы".
Кроме того, после устранения проблемных отношений существует хорошая вероятность того, что простое "Обновить" на модели не будет корректно удалять ошеломляющие отношения с моделью, и вы получите ту же ошибку даже после того, исправить ", поэтому сделайте это самостоятельно в модели перед выполнением обновления. (Я нашел это с трудом.)
Если вы проверили свои отношения и там хорошо.
Удалить таблицу в edmx, а затем обновить из базы данных. Это позволит вам сохранить обновление вручную.
Для меня это был неправильно расположенный внешний ключ в таблице, но даже после изменения таблицы, чтобы исправить это, он все еще не работал. Вам необходимо обновить файлы EDMX (и недостаточно, чтобы "обновить" таблицу из модели, вам нужно удалить и снова добавить таблицу в модель).
В дополнение к принятому ответу, если вы используете генератор EF Reverse POCO или какой-либо другой инструмент, который генерирует ваши POCO, убедитесь, что вы регенерируете!
Моя проблема была вызвана избыточным определением первичного ключа в конфигурации.
this
.Property(p => p.Id)
.HasColumnName(@"id")
.IsRequired()
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) // this is redundant when you want to configure a One-to-Zero-or-One relationship
.HasColumnType("int");
Удалить эту строку
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
Этого достаточно, чтобы определить отношения
// Configure Student & StudentAddress entity
modelBuilder.Entity<Student>()
.HasOptional(s => s.Address) // Mark Address property optional in Student entity
.WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student
В моем случае проблема была вызвана двунаправленной зависимостью 1-1:
class Foo{
[Key]
Id
[ForeignKey]
BarId
...
}
class Bar{
[Key]
Id
[ForeignKey]
FooId
...
}
Мне пришлось просто удалить один из двух внешних ключей (не обязательно).
В моем случае просто было, что у меня не было прав, установленных в базе данных. Я только что прочитал, и инфраструктура Entity дала мне ошибку ReferentialConstraint, которая отбросила меня. Добавлены дополнительные права на запись, и все было хорошо.
В моем случае у меня было свойство Database Generated, а свойство navigationInsideKey, настроенное для ссылки на таблицу с 1 по 1.
Это не то, что я мог удалить, мне нужно было как установить первичный ключ сущности для создания базы данных. И мне нужно было иметь возможность ссылаться на таблицу 1 на 1 в качестве свойства навигации.
Не уверен, что это одно и то же для других, но эта проблема возникала только при создании нового объекта, чтение или редактирование существующих объектов не отображало этой проблемы, поэтому я столкнулся с проблемой, создав унаследованную версию моего Контекст и использование метода Fluent для отключения свойства навигации при создании.
Итак, мой первоначальный объект выглядел так:
public partial class MyEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid id{ get; set; }
// Navigation
[ForeignKey("id")]
public PathEntity Path { get; set; }
}
Итак, я создал специальный унаследованный контекст, который выглядел так:
private class _navPropInhibitingContext : EF.ApplicationDBContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyEntity>()
.Ignore(e => e.Path);
}
}
а затем изменил код, создавший новый объект, чтобы сделать пользователя нового типа контекста
using (var specialContext = new _navPropInhibitingContext())
{
var dbModel = new MyEntity()
{
...
};
specialContext.MyEntity.Add(dbModel);
await specialContext.SaveChangesAsync();
}
Надеюсь, что это поможет кому-то.
В моем случае поле Id с FK только в Entity Framework для свойства "StoreGeneratedPattern" было установлено "Itentity" вместо "None"