3

對於首次涉足代碼的EF來說,請原諒我。我的問題是我不想將外鍵屬性添加到模型,並根據MSDN使用流暢的API沒有問題,但我無法找出我目前的情況正確的使用。它看起來很簡單:EF6中的外鍵問題CF

public class Package 
{ 
    public Package() 
    { 
     Users = new Collection<User>(); 
    } 

    public Int32 Id {get; set;} 
    public String Name {get; set;} 
    public virtual User Creator {get; set;} 

    public virtual ICollection<User> Users {get; set;} 
} 

public class User 
{ 
    public Int32 Id {get; set;} 
    public String Name {get; set;} 
} 

public class PackageContext : DbContext 
{ 
    public DbSet<Package> Packages {get; set;} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Package>().HasRequired(p => p.Creator).WithMany(); 
     modelBuilder.Entity<Package>().HasMany(p => p.Users).WithRequired().Map(c => c.MapKey("PackageId")); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

我已經嘗試了許多不同的流利組合,但沒有任何工作正常。我得到的最常見的異常是:

System.Data.Entity.Infrastructure.DbUpdateException:保存不公開其關係的外鍵屬性的實體時發生錯誤。 EntityEntries屬性將返回null,因爲單個實體不能被識別爲異常的來源。通過在您的實體類型中公開外鍵屬性,可以更輕鬆地處理保存時的異常。

有人能幫我弄清楚創建模型時需要做的正確的流利調用嗎?

回答

2

ü應使用此:

public class Package 
{ 
    public Int32 Id {get; set;} 
    public String Name {get; set;} 
    public Int32 UserId {get; set;} 

    public virtual User Creator {get; set;}  
} 

public class User 
{ 
    public User() 
    { 
     Packages = new Collection<Package>(); 
    } 

    public Int32 Id {get; set;} 
    public String Name {get; set;} 

    public virtual ICollection<Package> Packages {get; set;} 
} 

public class PackageContext : DbContext 
{ 
    public DbSet<Package> Packages {get; set;} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Package>().HasRequired(current => current.Creator) 
      .WithMany(c=>c.Packages) 
      .HasForeignKey(c=>c.UserId) 
      .WillCascadeOnDelete(false); 

    base.OnModelCreating(modelBuilder); 
    } 
}