簡體   English   中英

單個表實體框架4.3.1中的多個外鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM