1

EF は自動インクリメント フィールドを更新しませんが、entityframework を使用してエンティティを保存しようとしています

public class Address
{
    public int Id { get; set; }
    public int DatacenterId { get; set; }
    public virtual Datacenter Datacenter { get; set; }
}

public class AddressMapping : EntityTypeConfiguration<Address>
{
    public AddressMapping()
    {
        this.HasKey(k => new { k.Id, k.DatacenterId });
        this.HasRequired(itr => itr.Datacenter)
            .WithMany()
            .HasForeignKey(fk => fk.DatacenterId);

        this.Property(p => p.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    }
}

using (var context = new MyContext())
{
    var address = new Address(); //Initialize and set all values. Include the FK
    context.Address.Add(address);
    context.SaveChanges();

    //address.Id is still 0
}

mySql から次のコマンドをプロファイリングしました。

INSERT INTO `address`(
    `Id`, 
    `DatacenterId`, 
)VALUES(
    0, 
    1, 
)
4

1 に答える 1

2

マッピング コマンドの順序を変更しましたが、機能しています。EF マッピング コマンドがマッピング結果を変更できるとは知りませんでした。

public class AddressMapping : EntityTypeConfiguration<Address>
{
    public AddressMapping()
    {
        this.Property(p => p.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        this.HasKey(k => new { k.Id, k.DatacenterId });

        this.HasRequired(itr => itr.Datacenter)
            .WithMany()
            .HasForeignKey(fk => fk.DatacenterId);
    }
}

そして最後に、正しい sql コマンドが生成されました。

INSERT INTO `address`(
    `DatacenterId`, 
)VALUES(
    1, 
);
SELECT
    `Id`
FROM 
    `address`
WHERE  
     row_count() > 0 AND `Id` = last_insert_id() AND `DatacenterId` = 1
于 2013-09-20T13:06:44.860 に答える