WithRequired()無定義擴展方法

asp.net-identity asp.net-mvc c# entity-framework-core

我一直在尋找過去三個小時試圖弄清楚發生了什麼,最後不得不打破並發布一個問題。

我試圖將WithRequired()/ HasRequired()添加到我的ApplicationUser的模型構建器,但它告訴我它沒有定義。

我是在這裡完全無知,還是用.Net Core / EF Core框架改變了?

ApplicationUser:

public class ApplicationUser : IdentityUser
{
    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    public ICollection<Following> Followers { get; set; }

    public ICollection<Following> Followees { get; set; }

    public ApplicationUser()
    {
        Followers = new Collection<Following>();
        Followees = new Collection<Following>();
    }
}

Following.cs:

public class Following
{
    [Key]
    [Column(Order = 1)]
    public string FollowerId { get; set; }

    [Key]
    [Column(Order = 2)]
    public string FolloweeId { get; set; }

    public ApplicationUser Follower { get; set; }
    public ApplicationUser Followee { get; set; }
}

ApplicationDbContext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Gig> Gigs { get; set; }
    public DbSet<Genre> Genres { get; set; }

    public DbSet<Attendance> Attendances { get; set; }

    public DbSet<Following> Followings { get; set; }

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        // Customize the ASP.NET Identity model and override the defaults if needed.
        // For example, you can rename the ASP.NET Identity table names and more.
        // Add your customizations after calling base.OnModelCreating(builder);

        builder.Entity<Attendance>()
            .HasKey(c => new { c.GigId, c.AttendeeId });

        builder.Entity<ApplicationUser>()
            .HasMany(u => u.Followers);

        builder.Entity<ApplicationUser>()
            .HasMany(u => u.Followees);
    }
}

我嘗試添加WithRequired()/ HasRequired()時出錯: 沒有

一般承認的答案

@Tseng很接近,但還不夠。使用建議的配置,您將獲得帶有消息的異常:

無法確定在“Account.User”和“User.Account”之間檢測到的一對一關係的子/從屬方。要標識關係的子/依賴方,請配置外鍵屬性。有關詳細信息,請參閱http://go.microsoft.com/fwlink/?LinkId=724062

它基本上在鏈接的文檔中進行了解釋。

首先,您需要使用HasOneWithOne

其次, 必須使用HasForeignKey指定兩個實體中的哪一個是從屬實體(當其中一個實體中沒有定義單獨的FK屬性時,無法自動檢測到它)。

第三,沒有必要的依賴 。當依賴實體使用單獨的FK(而不是您的情況下的PK,即使用所謂的共享主鍵關聯,因為PK顯然不能為空)時, IsRequired方法可用於指定是否需要FK。

話雖如此,發布模型的正確F Core流暢配置如下:

modelBuilder.Entity<User>()
    .HasOne(e => e.Account)
    .WithOne(e => e.User)
    .HasForeignKey<Account>(e => e.AccountId);

結果是:

migrationBuilder.CreateTable(
    name: "User",
    columns: table => new
    {
        UserId = table.Column<int>(nullable: false)
            .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
        Email = table.Column<string>(nullable: true),
        Name = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_User", x => x.UserId);
    });

migrationBuilder.CreateTable(
    name: "Account",
    columns: table => new
    {
        AccountId = table.Column<int>(nullable: false),
        CreatedDateTime = table.Column<DateTime>(nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Account", x => x.AccountId);
        table.ForeignKey(
            name: "FK_Account_User_AccountId",
            column: x => x.AccountId,
            principalTable: "User",
            principalColumn: "UserId",
            onDelete: ReferentialAction.Cascade);
    });

熱門答案

與其他名字幾乎一樣。

modelBuilder.Entity<User>()
    .HasOne(s => s.Account) 
    .WithOne(ad => ad.User)
    .IsRequired(false);


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因