AspNetUser 上的实体框架流利的 api 1:1 属性无法更改 Account_Id 属性

Posted

技术标签:

【中文标题】AspNetUser 上的实体框架流利的 api 1:1 属性无法更改 Account_Id 属性【英文标题】:Entity framework fluent api 1:1 property on AspNetUser to other table cannot change Account_Id property 【发布时间】:2018-03-23 03:08:39 【问题描述】:

我正在使用 fluent api 为我的实体数据库设置关系。我有典型的 AspNetUsers 表,该表有一个名为 Id (String) 的列,它是表的主键。我扩展了 IdentityUser 并赋予它其他属性,2 个这样的属性是 AdvisorProfile 和 StudentProfile。

ApplicationUser 具有可选的 AdvisorProfile 和 StudentProfile。 AdvsiorProfile 和 StudentProfile 具有必需的帐户 (ApplicationUser)。

我的问题是,当表格生成时,AdvisorProfile 有一个名为 Account_Id 的属性,它是指向 AspNetUser 表格中 ApplicationUser 的链接。我想更改该命名约定,但我流畅的 api 代码似乎没有什么不同。

Fluent Api for Account -> 顾问/账户外键命名

//Advisor Profile to Login Account
modelBuilder.Entity<ApplicationUser>().HasOptional(x => x.AdvisorProfile).WithRequired(x => x.Account).Map(x => x.MapKey("AdvisorFK"));
modelBuilder.Entity<ApplicationUser>().HasOptional(x => x.AdvisorProfile).WithRequired(x => x.Account).WillCascadeOnDelete(false);

modelBuilder.Entity<Advisor>().HasRequired<ApplicationUser>(x => x.Account).WithOptional(x => x.AdvisorProfile).Map(x => x.MapKey("AccountFK"));
modelBuilder.Entity<Advisor>().HasRequired<ApplicationUser>(x => x.Account).WithOptional(x => x.AdvisorProfile).WillCascadeOnDelete(false);

表格生成代码:

CreateTable(
    "dbo.Advisors",
    c => new
        
            Id = c.Long(nullable: false, identity: true),
            FirsName = c.String(),
            LastName = c.String(),
            MiddleName = c.String(),
            Email = c.String(),
            PhoneNumber = c.String(),
            PrimaryContact = c.Int(nullable: false),
            Account_Id = c.String(nullable: false, maxLength: 128),
                    )
                .PrimaryKey(t => t.Id)
                .ForeignKey("dbo.AspNetUsers", t => t.Account_Id) //Here is the issue
                .Index(t => t.Account_Id);

【问题讨论】:

【参考方案1】:

问题是您为一个相同的关系使用了多个流畅的配置,这很容易出错并且很难说哪个真正适用。

根据经验,始终对每个关系使用单一流畅的映射。在你的情况下,它应该是这样的:

//Advisor Profile to Login Account
modelBuilder.Entity<ApplicationUser>()
    .HasOptional(x => x.AdvisorProfile)             
    .WithRequired(x => x.Account)
    .Map(x => x.MapKey("AdvisorFK"))
    .WillCascadeOnDelete(false);

【讨论】:

以上是关于AspNetUser 上的实体框架流利的 api 1:1 属性无法更改 Account_Id 属性的主要内容,如果未能解决你的问题,请参考以下文章

用于一对一识别关系的实体框架代码优先流利 API 配置

无法在 .NET 中的实体框架代码优先方法中迁移 AspNetUser 实体

使用实体框架流利语法或内联语法编写递归 CTE

多对多实体框架和存储库模式插入/更新

一对零或一关系实体框架

如何使用流利的 api 在 EF6 中映射值对象标识?