2

我想基於命名約定創建與實體框架的關係的1:n關係。我正在使用codefirst。實體框架忽略的公約和alwas創建兩個外鍵列,而不是隻有一個:實體框架代碼在創建1:n關係時,首先在數據庫中生成兩個外鍵列

  • StreamWorkerUser_Id(我想僅此列)
  • StreamWorkerUser_Id1

的配置類配置類似如下:

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; } 
} 

是否有可能,屬性CreatorLastEditor干擾數據庫遷移?

我是否正確理解約定?

更多的信息:

  • 實體框架版本6.1.3
  • Microsoft.AspNet.Identity.Core 2.2.1
  • Microsoft.AspNet.Identity.EntityFramework 2.2.1
  • ASP在碧霞
  • C#6.0
  • .NET 4 MVC 5
  • SQL服務器.NET框架4.5.2
  • 所有這些代碼是一類libary
+0

你怎麼又希望存儲關係Creator和LastEditor如果你只想要一個外鍵? – faint220

+0

@ faint220我不想只有一個外鍵。應該有三個。一個用於'Creator',一個用於'LastEditor',一個用於'StreamWorkerUser'。目前有4個列生成:Creator_Id,LastEditor_Id,StreamWorkerUser_Id,StreamWorkerUser_Id1。 –

+0

您是否嘗試過實體類型配置?你可以明確地聲明外鍵使用流利的API – Efe

回答

0

所以,你可能會認爲,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; } 
+0

謝謝你的回答,但在我的情況下,columnames是從字段名生成的。請參閱問題下的評論。 –

相關問題