0

私は移行でEF Code Firstを学んでいます.3つのエンティティがあります:

[User] 1--->* [Call] 1--->* [ETA]

コード :

ユーザー.cs

public class User
{
    [Key]
    public int Id { get; set; }

    public Guid LongId { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<Call> Calls { get; set; } // many calls

    public User()
    {
        LongId = Guid.NewGuid();
    }
}

Call.cs

public class Call
{
    [Key]
    public int Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string BreakdownNo { get; private set; }

    [Required,MaxLength(32)]
    public string Customer { get; set; }

    [Required,MaxLength(32)]
    public string TrailerNo { get; set; }

    [Required, MaxLength(32)]
    public string DepotContact { get; set; }

    [Required, MaxLength(48), RegularExpression(@"^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$")]
    public string DepotEmail { get; set; }

    [Required, MinLength(9), MaxLength(32)]
    public string DepotPhone { get; set; }

    [Required, MaxLength(32)]
    public string DriverContact { get; set; }

    [Required, MinLength(9), MaxLength(32), RegularExpression(@"^(7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$")]
    public string DriverPhone { get; set; }

    [Required, MaxLength(256)]
    public string LocatedAtFreeText { get; set; }

    [Required, MaxLength(8), RegularExpression(@"^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {0,1}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$")]
    public string LocatedAtPostCode { get; set; }

    [Required, MaxLength(16)]
    public string StartupNo { get; set; }

    [Required]
    public bool IsLoaded { get; set; }

    [Required, MaxLength(256)]
    public string FaultDescription { get; set; }

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

    public DateTime? EndTime { get; set; }
    public string Status { get; set; }

    public virtual User Controller { get; set; } // 1 controller
    public virtual ICollection<ETA> ETAs { get; set; } // many ETAs

    public Call()
    {
        StartTime = DateTime.Now;
        ETAs = new List<ETA> { new ETA() };
        Status = "Logged";
    }
}

ETA.c

public class ETA
{
    [Key]
    public int Id { get; set; }

    [Required]
    public TimeSpan Value { get; set; }

    public int CallId { get; set; }

    public ETA()
    {
        Value = TimeSpan.FromMinutes(90);
    }
}

を削除するUserと、 の がすべて削除さCallsれ、 のUserがすべて削除されETAsますCalls

(データベース エクスプローラーを使用して) データベースからユーザー行を削除すると、次のエラーが表示されます。

行は削除されませんでした。行 201 を削除しようとして問題が発生しました。エラー ソース: .Net SqlClient データ プロバイダー。エラー メッセージ: DELETE ステートメントは、REFERENCE 制約 "FK_dbo.Calls_dbo.Users_Controller_Id" と競合しました。データベース「BreakdownDb」、テーブル「dbo.Calls」、列「Controller_Id」で競合が発生しました。

4

2 に答える 2

0

解決策は、クラスにOnModelCreatingメソッドを追加することでした。DbContext

public class BreakdownDb : DbContext
{
    public DbSet<Call> Calls { get; set; }
    public DbSet<User> Users { get; set; }

    public BreakdownDb(): base("name=DefaultConnection") {}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().HasMany(x => x.Calls).WithRequired();
        modelBuilder.Entity<Call>().HasMany(x => x.ETAs).WithRequired();
    }
}
于 2013-01-22T10:52:14.303 に答える
0

Entity Framework でカスケード削除オプションをオンにすることができます。詳細については、http: //blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-deleteを参照してください。 -really-works-in-ef.aspx

于 2013-01-21T16:54:13.770 に答える