An error occurred while saving entities that do not expose foreign key properties for their relationships

后端 未结 15 1406
难免孤独
难免孤独 2020-12-08 02:43

I have a simply code in Entity Framework 4.1 code first:

PasmISOContext db = new PasmISOContext();
var user = new User();
user.CreationDate = Da         


        
15条回答
  •  佛祖请我去吃肉
    2020-12-08 02:45

    In my case the exeception was thrown because EF had created a migration incorrectly. It missed setting the identity: true on the second table. So go into the migrations which created the relevant tables and check if it missed to add identity.

    CreateTable(
        "dbo.LogEmailAddressStats",
        c => new
            {
                Id = c.Int(nullable: false, identity: true),
                EmailAddress = c.String(),
            })
        .PrimaryKey(t => t.Id);
    
    CreateTable(
        "dbo.LogEmailAddressStatsFails",
        c => new
            {
                Id = c.Int(nullable: false), // EF missed to set identity: true!!
                Timestamp = c.DateTime(nullable: false),
            })
        .PrimaryKey(t => t.Id)
        .ForeignKey("dbo.LogEmailAddressStats", t => t.Id)
        .Index(t => t.Id);
    

    An Id column should have identity (i.e. auto-incrementing!) so this must be a EF bug.

    You could add identity manually with SQL directly to the database but I prefer using Entity Framework.

    If you run in to the same problem I see two easy solutions:

    Alt 1

    reverse the incorrectly created migration with

    update-database -target:{insert the name of the previous migration}
    

    Then add the identity: true manually to the migration code and then update-database again.

    Alt 2

    you create a new migration that adds identity. If you have no changes in the models and you run

    add-migration identity_fix
    

    it will create an empty migration. Then just add this

        public partial class identity_fix : DbMigration
        {
            public override void Up()
            {
                AlterColumn("dbo.LogEmailAddressStatsFails", "Id", c => c.Int(nullable: false, identity: true));
            }
    
            public override void Down()
            {
                AlterColumn("dbo.LogEmailAddressStatsFails", "Id", c => c.Int(nullable: false));
            }
        }
    

提交回复
热议问题