第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

無法定義沒有 PK 的表

無法定義沒有 PK 的表

C#
阿波羅的戰(zhàn)車 2022-01-16 15:08:35
我有一個(gè)名為的表AspNetUsers,它是由創(chuàng)建的默認(rèn)表AspNetCore.Identity,我創(chuàng)建了一個(gè)名為的類User,它繼承IdentityUser并實(shí)現(xiàn)了更多字段AspNetUsers:public class User : IdentityUser{    public string FirstName { get; set; }    public string LastName { get; set; }    public DateTime BirthDate { get; set; }    public string LockoutMessage { get; set; }    public string SessionId { get; set; }    public virtual UserDetails UserDetail { get; set; }}然后我創(chuàng)建了另一個(gè)名為的類UserDetails,我不需要PK在這個(gè)表中,因?yàn)閁serDetails我需要存儲可用用戶的詳細(xì)信息,User其中是AspNetUsers表:public class UserDetails{    //public string Id { get; set; }    public string Biography { get; set; }    public string Country { get; set; }    public string FacebookLink { get; set; }    public string TwitterLink { get; set; }    public string SkypeLink { get; set; }    public string UserId { get; set; }    public virtual User User { get; set; }}現(xiàn)在,如果我取消注釋該Id屬性,遷移效果很好,但我不需要,Id所以我注釋了該屬性并執(zhí)行此命令:add-migration Initial-Migration -context DemoAppContextupdate-database在DemoAppContext我告訴要EF實(shí)現(xiàn)FKon的類中UserDetails:public class DemoAppContext : IdentityDbContext<User>{    public DemoAppContext(DbContextOptions<DemoAppContext> options) : base(options)    {    }    protected override void OnModelCreating(ModelBuilder builder)    {        base.OnModelCreating(builder);        builder.Entity<User>(entity =>        {            entity.HasOne(d => d.UserDetail)                  .WithOne(p => p.User)                  .HasForeignKey<UserDetails>(x => x.UserId);        });    }    public DbSet<UserDetails> UserDetails { get; set; }}命令后Add-Migration我收到此錯(cuò)誤:實(shí)體類型“UserDetails”需要定義一個(gè)主鍵。正如我所說,如果我注釋掉Id所有工作正常,但我不需要PKon UserDetails。
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊

正如我所說,如果我注釋掉 Id 一切正常,但我不需要對 UserDetails 進(jìn)行 PK


如果我理解正確,您只是不想添加額外的列(例如,Id或UserDetailsId)設(shè)置為 PK 。UserDetails您要創(chuàng)建的表將有一個(gè)引用UserId該表的User表,并且UserId將同時(shí)用作主鍵和外鍵。


事實(shí)上,沒有必要擁有entity的Id屬性。UserDetails那么為什么你的代碼不起作用呢?原因是您混淆了從屬實(shí)體和主體實(shí)體。


HasForeignKey<>()方法的原型是:


public virtual ReferenceReferenceBuilder<TEntity,TRelatedEntity> HasForeignKey<TDependentEntity> 

    (

        Expression<Func<TDependentEntity,object>> foreignKeyExpression

    ) 

    where TDependentEntity : class;

HasForeignKey<TDependentEntity>()注意代表依賴實(shí)體的通用參數(shù)。


這是你的代碼:


builder.Entity<User>(entity =>

{

    entity.HasOne(d => d.UserDetail)

            .WithOne(p => p.User)

        .HasForeignKey<UserDetails>(x => x.UserId);

});

看到了嗎?在您的代碼中,entity這里是UserPrincipal Entity 而不是 Dependent Entity。要修復(fù)它,請更改您的代碼,如下所示:


protected override void OnModelCreating(ModelBuilder builder)

{

    base.OnModelCreating(builder);


    builder.Entity<User>(entity =>

    {

        entity.HasOne(u => u.UserDetail).WithOne(d => d.User);

    });


    builder.Entity<UserDetails>(entity =>

    {

        // set the UserId as key

        entity.HasKey(d=>d.UserId);


        // the relationship between `UserDetails : User`  is  1-to-1

        entity.HasOne(d=>d.User).WithOne(u=>u.UserDetail)

            // set column `UserId` as the FK for the dependent entity , i.e. , the `UserDetails` .

            .HasForeignKey<UserDetails>(u=>u.UserId); 

    });

}

它將同時(shí)生成一個(gè)列設(shè)置為 PrimaryKey 和 ForeignKey 的UserDetails表:UserId


CREATE TABLE [dbo].[UserDetails] (

    [Biography]    NVARCHAR (MAX) NULL,

    [Country]      NVARCHAR (MAX) NULL,

    [FacebookLink] NVARCHAR (MAX) NULL,

    [TwitterLink]  NVARCHAR (MAX) NULL,

    [SkypeLink]    NVARCHAR (MAX) NULL,

    [UserId]       NVARCHAR (450) NOT NULL,

    CONSTRAINT [PK_UserDetails] PRIMARY KEY CLUSTERED ([UserId] ASC),

    CONSTRAINT [FK_UserDetails_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE

);

順便說一句,Visual Studio 的 SQL Server 對象資源管理器中似乎存在一個(gè)錯(cuò)誤(請參閱我的問題here),導(dǎo)致我們無法看到已經(jīng)存在的 FK 約束的錯(cuò)誤。


但是,我們可以通過嘗試使用不存在的 UserId 插入一行來證明這一點(diǎn):


insert into UserDetails 

    (Biography,UserId) 

values 

    ('hello,wrold','here-is-a-non-existing-user-id')

它將按預(yù)期抱怨以下消息:


消息 547,第 16 級,狀態(tài) 0,第 1 行


INSERT 語句與 FOREIGN KEY 約束“FK_UserDetail_AspNetUsers_UserId”沖突。沖突發(fā)生在數(shù)據(jù)庫“App-EFCore-FK-Test”、表“dbo.AspNetUsers”、“Id”列中。


該語句已終止。


查看完整回答
反對 回復(fù) 2022-01-16
  • 1 回答
  • 0 關(guān)注
  • 153 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號