写入数据库时出现此错误:
ReferentialConstraint中的依赖属性映射到a 存储生成的列。专栏:'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;
}
架构是:
答案 0 :(得分:167)
您是否可能在表之间定义了错误的列关系?不同的列和一个被设置为自动数字。
发生在我身上。
答案 1 :(得分:45)
此错误表示您使用的是不受支持的关系,或者您的映射中存在错误。您的代码很可能与错误完全无关。
错误意味着您在依赖实体中的外键属性被定义为存储生成的实体之间存在某种关系。存储生成的属性将填充到数据库中。 EF不支持将存储生成的属性作为外键(以及主键中的计算属性)。
答案 2 :(得分:8)
我遇到了同样的问题。基于这里提供的答案,我能够跟踪并解决它,但我有一个奇怪的问题如下所述 - 它可能在将来帮助某人。
在我的依赖表上,外键列已设置为StoreGeneratedPattern =“Identity”。我不得不把它改成“无”。不幸的是,在设计师内部这样做根本不起作用。
我查看了设计器生成的XML(SSDL),这些属性仍然存在,所以我手动删除它们。我还必须修复数据库上的列(从CREATE TABLE SQL中删除Identity(1,1))
之后,问题就消失了。
答案 3 :(得分:5)
我遇到了同样的问题,在sql server中对表设计进行了一些挖掘之后,我发现我错误地将表的主键设置为外键。
在此图像中,您可以看到JobID是表的主键,但也是错误的外键。
答案 4 :(得分:1)
重新检查付款与其他表/实体之间的关系。包括不应包含PaymentId的那些,因为那是问题最有可能隐藏的地方。
在SQL Server Management Studio中创建外键时,主键是默认的,并且在更改父表时会还原此默认值,因此请务必在“表和列”窗口中以正确的顺序更改值。
此外,在您修复了有问题的关系之后,模型上的简单“刷新”很可能无法正确地从模型中删除错误的关系,即使在“之后”也会出现相同的错误。 修复“,因此在执行刷新之前,请在模型中自行执行此操作。 (我发现这很困难。)
答案 5 :(得分:1)
如果你已经检查了你的人际关系并且在那里很好。
删除edmx中的表,然后从数据库更新。这将节省您手动更新。
答案 6 :(得分:1)
对我而言,这是一个错误放置的外键,但即使在更改表格以修复它之后,它仍然无效。您需要更新EDMX文件(并且不足以刷新"模型中的表格,您需要删除并在模型中再次添加表格。)
答案 7 :(得分:1)
除了接受的答案,如果您使用的是EF反向POCO生成器或其他生成POCO的工具,请确保重新生成它们!
答案 8 :(得分:1)
我的问题是由配置中主键的冗余定义引起的。
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
答案 9 :(得分:0)
在我的情况下,问题是由双向1-1关系引起的:
class Foo{
[Key]
Id
[ForeignKey]
BarId
...
}
class Bar{
[Key]
Id
[ForeignKey]
FooId
...
}
我只需要删除两个外键中的一个(无论如何都不需要)。
答案 10 :(得分:0)
就我而言,我只是没有在数据库上正确设置权限。我只读过set并且Entity框架给了我一个ReferentialConstraint错误,它让我失望了。添加了额外的写权限,一切都很顺利。
答案 11 :(得分:0)
就我而言,我有一个Database Generated属性,并设置了一个ForeignKey导航属性来引用一对一的相关表。
这不是我可以删除的东西,我需要能够将实体的主键设置为Database Generated并且我需要能够引用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();
}
希望这有助于某人
答案 12 :(得分:0)
在我的情况下,仅在实体框架中具有FK的ID字段将属性“ StoreGeneratedPattern”设置为“ Itentity”,而不是“ None”