[英]Multiple Foreign keys in single Table Entity Framework 4.3.1
我是EF的新手,並且已經閱讀了一些教程,並用Google搜索了很多天才能找到解決我問題的方法。 抱歉,我的英語水平不是最好,但是我想嘗試提出我的問題。
我的模型是從SQL Express數據庫創建的(縮小版本以更好地理解):
參見圖片 :
現在,我嘗試用演示數據填充我的數據庫。 我創建一個Liegenschaft對象,並在其中填充數據。 顯示我的數據樹的簡單版本(真實版本在ObjektMenge = List中也可以包含很多HAUS的對象,對於ObjektMenge = List也是如此。
List<Liegenschaft> LL = new List<Liegenschaft>();
for (int i = 0; i < 2; i++)
{
Liegenschaft L = new Liegenschaft()
{
Strasse = "demostreet1",
HausMenge = new List<Haus>(){
new Haus(){
Nummer = 21,
ObjektMenge = new List<Objekt>(){
new Objekt(){
Zimmer = 221,
MieterMenge= new List<Mieter>(){
new Mieter(){
Name="DemoName",
MietzinsMenge= new List<Mietzins>(){
new Mietzins(){
StartDate=System.DateTime.Now,
EndDate=System.DateTime.Now},
new Mietzins(){
StartDate=System.DateTime.Now,
EndDate=System.DateTime.Now}
}
}
}
}
}
}
}
};
LL.Add(L);
}
foreach (Liegenschaft Lieg in LL)
{
using (var db = new ImmoReportsEntities())
{
db.Liegenschaft.Add(Lieg);
db.SaveChanges();
}
}
我的所有演示數據都可以保存到數據庫中,並且在未填充MietzinsMenge時會自動正確創建所有FK!
如果我在此MietzinsMenge中有數據,則會出現錯誤:FK_Mietzins_Objekt具有相同的主鍵!
我不使用表格將數據插入此Tabel的所有數據都來自另一個(外部)數據庫,而我想將此數據導入到我的數據庫中。 我如何也可以在數據樹中導入此MietZins並擁有所有這些FK(LiegenschftId,ObjektId,MieterId)。
您似乎沒有為Mietzins對象設置主鍵值。 您需要先設置主鍵值,然后再嘗試保存到數據庫,或者告訴EF該主鍵將由數據庫生成。
如何指定密鑰是由數據庫生成的,取決於您使用的是Code First還是Database First。 在“代碼優先”中,默認情況下,整數鍵類型通常啟用該功能,也可以使用DatabaseGeneratedAttribute並設置Identity。 對於“數據庫優先”,您使用EF設計器並將密鑰屬性的StoreGenerated方面設置為Identity。
我使用以下類和Code First映射重新創建了如圖所示的模型。 (我知道您可能沒有使用Code First,但這是我創建具有所有關系的相同模型的最簡單方法,如圖所示。)
public class Mietzins
{
public int Id { get; set; }
public int LiegenschaftId { get; set; }
public int MieterId { get; set; }
public int ObjektId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public Liegenschaft Liegenschaft { get; set; }
public Mieter Mieter { get; set; }
public Objekt Objekt { get; set; }
}
public class Mieter
{
public int Id { get; set; }
public int LiegenschaftId { get; set; }
public int ObjektId { get; set; }
public string Name { get; set; }
public Liegenschaft Liegenschaft { get; set; }
public ICollection<Mietzins> MietzinsMenge { get; set; }
public Objekt Objekt { get; set; }
}
public class Objekt
{
public int Id { get; set; }
public int LiegenschaftId { get; set; }
public int HausId { get; set; }
public int Zimmer { get; set; }
public Haus Haus { get; set; }
public Liegenschaft Liegenschaft { get; set; }
public ICollection<Mietzins> MietzinsMenge { get; set; }
public ICollection<Mieter> MieterMenge { get; set; }
}
public class Liegenschaft
{
public int Id { get; set; }
public string Strasse { get; set; }
public int UserId { get; set; }
public ICollection<Haus> HausMenge { get; set; }
public ICollection<Mieter> MieterMenge { get; set; }
public ICollection<Mietzins> MietzinsMenge { get; set; }
public ICollection<Objekt> ObjektMenge { get; set; }
}
public class Haus
{
public int Id { get; set; }
public int LiegenschaftId { get; set; }
public int Nummer { get; set; }
public ICollection<Objekt> ObjektMenge { get; set; }
public Liegenschaft Liegenschaft { get; set; }
}
內容:
public class ImmoReportsEntities : DbContext
{
public DbSet<Liegenschaft> Liegenschaft { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Liegenschaft>()
.HasMany(e => e.HausMenge)
.WithRequired(e => e.Liegenschaft)
.HasForeignKey(e => e.LiegenschaftId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Liegenschaft>()
.HasMany(e => e.MieterMenge)
.WithRequired(e => e.Liegenschaft)
.HasForeignKey(e => e.LiegenschaftId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Liegenschaft>()
.HasMany(e => e.MietzinsMenge)
.WithRequired(e => e.Liegenschaft)
.HasForeignKey(e => e.LiegenschaftId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Liegenschaft>()
.HasMany(e => e.ObjektMenge)
.WithRequired(e => e.Liegenschaft)
.HasForeignKey(e => e.LiegenschaftId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Haus>()
.HasMany(e => e.ObjektMenge)
.WithRequired(e => e.Haus)
.HasForeignKey(e => e.HausId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Objekt>()
.HasMany(e => e.MietzinsMenge)
.WithRequired(e => e.Objekt)
.HasForeignKey(e => e.ObjektId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Objekt>()
.HasMany(e => e.MieterMenge)
.WithRequired(e => e.Objekt)
.HasForeignKey(e => e.ObjektId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Mieter>()
.HasMany(e => e.MietzinsMenge)
.WithRequired(e => e.Mieter)
.HasForeignKey(e => e.MieterId)
.WillCascadeOnDelete(false);
}
}
然后,我完全按照問題中的代碼運行您的代碼,並且效果很好。
然后,我更改了Mietzins的主鍵,以使其不再是數據庫生成的:
public class Mietzins
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public int LiegenschaftId { get; set; }
public int MieterId { get; set; }
public int ObjektId { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public Liegenschaft Liegenschaft { get; set; }
public Mieter Mieter { get; set; }
public Objekt Objekt { get; set; }
}
我再次運行代碼,並得到以下異常:
未處理的異常:System.Data.Entity.Infrastructure.DbUpdateException:更新條目時發生錯誤。 有關詳細信息,請參見內部異常。 ---> System.Data.UpdateException:更新條目時發生錯誤。 有關詳細信息,請參見內部異常。 ---> System.Data.SqlClient.SqlException:違反主鍵約束'PK_Mietzins'。 無法在對象“ dbo.Mietzins”中插入重復的密鑰。 該語句已終止。
如果這與您看到的異常不同,請發布您的代碼以及完整的異常消息和堆棧跟蹤,我將再看一遍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.