2013-05-12 100 views
1

我有2個實體:實體框架代碼第一外鍵映射

  • 權利要求(ID,其它primirives,多了一個關係) - 權利要求表
  • ClaimDetail(ID,ClaimID的,其他原語,關係) - ClaimDetails 表

映射:

modelBuilder.Entity<Claim>() 
         .HasMany(x => x.ClaimDetails) 
         .WithRequired(x => x.Claim) 
         .HasForeignKey(x => x.ClaimID) 

甲屬泰德查詢:

exec sp_executesql N'SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[ClaimID] AS [ClaimID], 
[Extent1].[UserID] AS [UserID], 
[Extent1].[ClaimTypeID] AS [ClaimTypeID], 
[Extent1].[PermissionID] AS [PermissionID], 
[Extent1].[StartDate] AS [StartDate], 
[Extent1].[EndDate] AS [EndDate], 
[Extent1].[Justification] AS [Justification], 
[Extent1].[Claim_ID] AS [Claim_ID] 
FROM [dbo].[ClaimDetails] AS [Extent1] 
OUTER APPLY (SELECT TOP (1) [Project1].[ClaimDetailStatusID] AS [ClaimDetailStatusID] 
    FROM (SELECT 
     [Extent2].[ClaimDetailStatusID] AS [ClaimDetailStatusID], 
     [Extent2].[CreatedOn] AS [CreatedOn] 
     FROM [dbo].[ClaimDetailStatus] AS [Extent2] 
     WHERE [Extent1].[ID] = [Extent2].[ClaimDetailID] 
    ) AS [Project1] 
    ORDER BY [Project1].[CreatedOn] DESC) AS [Limit1] 
WHERE ([Extent1].[UserID] = @p__linq__0) AND (NOT ([Limit1].[ClaimDetailStatusID] IN (12,11,4,7,13,10)))',N'@p__linq__0 int',@p__linq__0=4106 

如果我離開了映射,然後EF會生成一個名爲Claim_ID1另一列。這有什麼問題?我應該如何定義關係?

編輯

public class Claim 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 
    [Required] 
    public int SenderID { get; set; } 

    [NotMapped] 
    public UserModel Sender { get; set; } //TODO: 

    [Required] 
    public DateTime Created { get; set; } 

    public string Note { get; set; } 
    [Required] 
    public int BossID { get; set; } 

    [NotMapped] 
    public UserModel Boss { get; set; } //TODO: 

    public virtual IList<ClaimDetail> ClaimDetails { get; set; } 
    public virtual IList<UserClaim> UserClaims { get; set; } 
} 

public class BaseClaimItem 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ID { get; set; } 

    [Required] 
    public int PermissionID { get; set; } 

    [Required] 
    public DateTime StartDate { get; set; } 

    [Required] 
    public DateTime EndDate { get; set; } 

    public string Justification { get; set; } 

    public virtual Permission Permission { get; set; } 

    [NotMapped] 
    public virtual UserModel Claimant { get; set; } 
} 


public class ClaimDetail : BaseClaimItem 
{ 
    [Required] 
    public virtual int ClaimID { get; set; } 

    [Required] 
    public int UserID {get;set;} 

    [NotMapped] 
    public override UserModel Claimant {get;set;} 

    [Required, Range(1, 5)] 
    public int ClaimTypeID { get; set; } 

    public virtual Claim Claim { get; set; } 
    public virtual IList<ClaimDetailStatus> ClaimDetailStatus { get; set; } 
    public virtual IList<Task> Tasks { get; set; } 
    public virtual IList<ClaimDetailApprovalStep> ClaimDetailApprovalSteps { get; set; } 

    public virtual ClaimType ClaimType { get; set; } 
} 
+0

無法重現。無論是否顯式映射,我只會得到一個'ClaimID'(留下不編譯的東西)。 – 2013-05-12 20:48:14

+0

這個:'public virtual int ClaimID {get;組; }'意味着什麼,如果你不映射'公共虛擬聲明聲明{get;組; ''給它。看,我的財產如何映射它在我的答案 – Komengem 2013-05-12 20:52:50

+0

奇怪的事情正在發生;我導出了EDMX,並在XML中看到了我的解決方案中不存在的類型,即使在排除的文件中也不存在。 – 2013-05-12 21:01:52

回答

1

上面沒有一個接口實現。在那個接口中有一個返回一個Collection的屬性。 [NotMapped]屬性缺失,現在可用於關聯。

3

如何嘗試一些簡單的與Property mapping而非Fluent API mapping;

public class Claim 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ClaimId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<ClaimDetail> ClaimDetails { get; set; } 
} 

public class ClaimDetail 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ClaimDetailId { get; set; } 

    [ForeignKey("Claim"), DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ClaimId { get; set; } 

    public string Detail { get; set; } 

    public virtual Claim Claim { get; set; } 
} 

流利的API映射應該是;

modelBuilder.Entity<Claim>() 
    .HasMany(c => c.ClaimDetail) 
    .WithOptional() 
    .Map(m => m.MapKey("ClaimId")); 
+0

不要運氣:ClaimID,Claim_ID,Claim_ID1 – 2013-05-12 19:53:10

+0

@PeterKiss請從'Server Explorer和App_Data'中刪除舊的數據庫,並使用Property映射示例再次運行'Update-Database -Force'。 – Komengem 2013-05-12 19:59:37

+0

不能這樣做。代碼優先並不意味着自動創建數據庫。 – 2013-05-12 20:09:48