![](/img/trans.png)
[英]Creating Code First 1:1 relationship in entity framework results in two foreign key fields
[英]Entity Framework Code First generates two foreign key columns in database when creating a 1:n relationship
我想基於創建關系的命名約定 ,使用Entity Framework創建1:n關系。 我正在使用codefirst。 實體框架忽略了約定,並且alwas創建了兩個外鍵列,而不是只創建一個:
配置類配置如下:
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
我正在使用Microsoft.Identity Framework,其中包含所有模型的自定義類。
我的DbContext類就像下面這么簡單。
public class StreamWorkerDataContext : IdentityDbContext<StreamWorkerUser, StreamWorkerRole, int, StreamWorkerUserLogin, StreamWorkerUserRole, StreamWorkerUserClaim>
{
public DbSet<Task> Tasks { get; set; }
}
Task
模型:
public class Task : StreamWorkerEntity
{
public StreamWorkerUser StreamWorkerUser { get; set; }
}
StreamWorkerUser
模型:
public class StreamWorkerUser : IdentityUser<int, StreamWorkerUserLogin, StreamWorkerUserRole, StreamWorkerUserClaim>
{
public virtual List<Task> Tasks { get; set; } // also tested ICollection
}
Task
類繼承自此基類型,這里還定義了StreamWorkerUser
類型的兩個屬性(但這些列在數據庫中正確生成。):
public class StreamWorkerEntity
{
[Key]
public int Id { get; set; }
public DateTimeOffset Created { get; set; }
public DateTimeOffset Updated { get; set; }
public StreamWorkerUser Creator { get; set; }
public StreamWorkerUser LastEditor { get; set; }
}
Creator
和LastEditor
屬性是否有可能擾亂數據庫遷移?
我是否正確理解慣例?
更多信息:
所以在這種情況下你可能會認為EF:
public StreamWorkerUser Creator { get; set; }
public StreamWorkerUser LastEditor { get; set; }
將創建creator_id和lasteditor_id,但它沒有,因為EF取了類名並制作了StreamWorkerUser_Id和StreamWorkerUser_Id1,因為已經使用了StreamWorkerUser_Id。 默認情況下,如果按類(而不是int字段)創建關系,則EF會根據類名(而不是字段名稱)生成其列名。
如果要為這些FK指定列名,您可以執行以下操作:
public int CreatorId { get; set; } //this field name will be column name
[ForeignKey("StreamWorkerUser")]
public StreamWorkerUser Creator { get; set; }
public int EditorId { get; set; } //this field name will also be column name
[ForeignKey("StreamWorkerUser")]
public StreamWorkerUser Editor { get; set; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.