C#学习教程:实体框架-一对一-ReferentialConstraint映射到StoreGeneratedColumn但是当我尝试插入时,出现以下错误:ReferentialConstraint映射到存储生成的列。列:“ACCOUNT_ID”。控制台应用示例:namespaceEF_ConsoleApp_Test{publicclassProgram{publicstaticvoidMain(string[]args){varaccount=newAccount{AccountNumber="00123456",CustomerValue=newCustomer{FirstName="Joe"}};使用(vardb=newMainContext()){db.Accounts.Add(account);db.SaveChanges();}}}[Serializable][Table("CUSTOMERS")]publicclassCustomer{[Key][Column("CUSTOMER_ID")]publicint?id{得到;放;}[必需][Column("FIRST_NAME")][StringLength(45)]publicstringFirstName{get;放;}publicvirtualAccountAccount{get;放;}publicCustomer(){}}[Serializable][Table("ACCOUNTS")]publicclassAccount{[Key][DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)][Column("ACCOUNT_ID")]publicint?id{得到;放;}[Required][Column("ACCOUNT_NUMBER")][Display(Name="AccountNumber")][StringLength(16)]publicstringAccountNumber{get;放;}[Column("CUSTOMER_ID")]publicint?CustomerId{得到;放;}酒吧licvirtualCustomerCustomerValue{get;放;}//////默认构造函数///publicAccount(){}}internalclassMainContext:DbContext{internalMainContext():base("name=DB.Context"){Database.SetInitializer(null);}publicvirtualDbSetAccounts{get;放;}publicvirtualDbSetCustomers{get;放;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){//配置FKmodelBuilder.Entity().HasRequired(c=>c.Account).WithRequiredPrincipal(a=>a.CustomerValue);base.OnModelCreating(模型构建器);}}}数据库表创建语言:CREATETABLE[dbo].[CUSTOMERS]([CUSTOMER_ID][INT]IDENTITY(1,1)NOTNULL,[FIRST_NAME][varchar](45)NOTNULL,CONSTRAINT[PK_CUSTOMERS]PRIMARYKEYCLUSTERED([CUSTOMER_ID]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY])ON[PRIMARY]GOCREATETABLE[dbo].[ACCOUNTS]([ACCOUNT_ID][INT]身份(1,1)NOTNULL,[CUSTOMER_ID][int]NOTNULL,[ACCOUNT_NUMBER][varchar](16)NOTNULL,CONSTRAINT[PK_ACCOUNTS]主键集群([ACCOUNT_ID]ASC)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY])ON[PRIMARY]ALTERTABLE[dbo].[ACCOUNTS]WITHCHECKADDCONSTRAINT[FK_ACCOUNTS_CUSTOMERS]FOREIGNKEY([CUSTOMER_ID])REFERENCES[dbo].[CUSTO([CUSTOMER_ID])GOApp.config:我需要更改什么才能使其正常工作?注意:按照惯例,EF6表示使用所谓的共享主密钥关联的一对一关系,其中依赖实体的PK也用作主体实体的FK在您的情况下,它处理帐户。Id作为客户的FK,并且由于它是自动生成的,您将获得相关的异常。另一个问题是EF6不支持具有显式FK属性的一对一关系(没有像HasForeignKey这样的流畅API用于一对多关系)。因此,您需要从模型中删除AccountId属性并仅保留导航属性。此外,虽然不是绝对必要,但请遵循命名约定并将其称为Account而不是AccountValue。换句话说,替换[Column("CUSTOMER_ID")]publicint?CustomerId{得到;放;}publicvirtualCustomerCustomerValue{get;放;}与公共虚拟客户Customer{get;放;}可以使用MapKeyFluentAPIFK列名指定:modelBuilder.Entity().HasRequired(c=>c.Account).WithRequiredPrincipal(a=>a.Customer).Map(m=>m.MapKey("CUSTOMER_ID"));//你完成了。现在,下面正确的是先插入一个新的Customer,然后引用一个引用它的新Account:很有用,需要多了解C#学习教程,希望大家多多关注——varaccount=newAccount{AccountNumber="00123456",Customer=newCustomer{FirstName="Joe"}};db.Accounts.Add(账户);db.SaveChanges();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
