كيفية إنشاء اثنين الملاحة خصائص نموذج واحد (EF6 الرمز الأول)

StackOverflow https://stackoverflow.com//questions/20020531

سؤال

باستخدام EF6 رمز الاتفاقية الأولى ، أريد إنشاء نموذج مع اثنين من مفاتيح خارجية على نفس الطاولة.على سبيل المثال, الآن لدي فريق نموذج:

public class Team
{
    public Guid Id { get; set; }
    public String Name { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}

و المباراة نموذج:

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    public virtual Team TeamHome { get; set; }
    public virtual Team TeamAway { get; set; }
}

ولكن بعد تشغيل مشروع لدي المقبل استثناء:

إدخال قيد المفتاح الخارجي 'FK_dbo.Matches_dbo.Teams_TeamHomeId على جدول مباريات' قد يسبب دورات متعددة أو سلسلة مسارات.تحديد على حذف أي عمل أو تحديث أي إجراء أو تعديل أخرى قيود المفاتيح الخارجية.لا يمكن إنشاء القيد.

أي التوصيات ؟

هل كانت مفيدة؟

المحلول

SQL Server هو إرجاع خطأ لأنه لا يمكن التعامل مع عدة تتالي مسارات.متعددة المسار هو المباراة وجود العديد من فريق خصائص.

مجموعة شلال على حذف كاذبة.

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
                    .HasRequired<Team>(i => i.TeamHome)
                    .WithMany(i => i.Matches)
                    .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

حيث لا يوجد تتالي حذف ، يجب حذف الفريق في المباريات الأولى قبل حذف الفريق نفسه.

نصائح أخرى

جرب هذا, إذا كنت تستخدم الهجرات.الهجرة ليست ذكية في كل مرة ، يجب أن interreput القانون في بعض الأحيان.

public class Match
{
    public Guid Id { get; set; }
    public Int32 TeamHomeScore { get; set; }
    public Int32 TeamAwayScore { get; set; }

    public Guid TeamHomeId { get; set; } // I want these properties to be foreign keys
    public Guid TeamAwayId { get; set; } //

    [ForeginKey("TeamHomeId")]
    public virtual Team TeamHome { get; set; }
    [ForeginKey("TeamAwayId")]
    public virtual Team TeamAway { get; set; }
}

ثم سيتم إضافة أدناه إلى DataContex.cs

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamHome )
               .WithMany()
               .HasForeignKey(u => u.TeamHomeId);

modelBuilder.Entity<Match>()
               .HasRequired(a => a.TeamAway )
               .WithMany()
               .HasForeignKey(u => u.TeamAwayId);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top