2012-01-15 70 views
0

私はPHP/MySQLの土地から来たEF CFから始めています。私はここで間違っていることを誰かが理解できるように助けてくれることを願っています。EFコード最初のエンティティの関係の問題

多くの素晴らしいチュートリアルを使用して、私はモデルクラスをリレーションシップで作成しました.DBは作成されていて、大丈夫です。しかし今、カスケード削除で問題が発生しています。

これは、エンティティがカスケード削除によって複数の方法で削除され、孤立したレコードが作成された場合に発生します。これは正しいですか?

public class jbsEntity 
{ 
    [Timestamp] 
    public Byte[] TimeStamp { get; set; } 

    //public User CreatedBy { get; set; } 
    //public User UpdatedBy { get; set; } 
} 

public class Customer : jbsEntity 
{ 
    public int Id { get; set; } 
    public string Salutation { get; set; } 

    [Required, StringLength(128)] 
    public string FirstName { get; set; } 

    [Required, StringLength(128)] 
    public string LastName { get; set; } 

    public string BillingName { get; set; } 

    [Required, StringLength(128)] 
    public string Address { get; set; } 

    [Required, StringLength(128)] 
    public string Suburb { get; set; } 

    [Required, StringLength(4)] 
    public string Postcode { get; set; } 

    public string BillingAddress { get; set; } 
    public string BillingSuburb { get; set; } 
    public string BillingPostcode { get; set; } 

    public virtual List<Contact> Contacts { get; set; } 

    public virtual List<Residence> Residences { get; set; } 

} 

public class Residence : jbsEntity 
{ 
    public int Id { get; set; } 

    [Required, StringLength(128)] 
    public string Name { get; set; } 

    [Required, StringLength(128)] 
    public string Address { get; set; } 

    [Required, StringLength(128)] 
    public string Suburb { get; set; } 

    [Required, StringLength(4)] 
    public string Postcode { get; set; } 

    public bool Active { get; set; } 
    public string AccessInstructions { get; set; } 
    public string ServiceFrequency { get; set; } 
    public string RegularServiceCost { get; set; } 

    [Required] 
    public int CustomerId { get; set; } 
    public virtual Customer Customer { get; set; } 

    public virtual List<Contact> Contacts { get; set; } 

    public virtual List<Pool> Pools { get; set; } 

    public virtual List<Job> Jobs { get; set; } 

    public virtual List<Image> Images { get; set; } 

} 

public class Pool : jbsEntity 
{ 
    public int Id { get; set; } 

    [Required, StringLength(128)] 
    public string Name { get; set; } 

    [Required, StringLength(128)] 
    public string Size { get; set; } 
    public string AccessInstructions { get; set; } 
    public string SurfcaceType { get; set; } 
    public bool Indoor { get; set; } 
    public decimal TargetPH { get; set; } 
    public decimal TargetIron { get; set; } 
    public decimal TargetCopper { get; set; } 
    public decimal TargetCalcium { get; set; } 
    public decimal TargetChlorine { get; set; } 
    public decimal TargetAlkaline { get; set; } 
    public decimal TargetStabiliser { get; set; } 

    [Required] 
    public int ResidenceId { get; set; } 
    public virtual Residence Residence { get; set; } 

    public virtual List<JobService> JobServices { get; set; } 

    public virtual List<Image> Images { get; set; } 

} 

public class Equipment : jbsEntity 
{ 
    public int Id { get; set; } 

    [Required, StringLength(128)] 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public DateTime Installed { get; set; } 
    public DateTime WarrantyExpiration { get; set; } 
    public string Status { get; set; } 

    [Required] 
    public int PoolId { get; set; } 
    public virtual Pool Pool { get; set; } 

    public virtual List<Image> Images { get; set; } 

} 

public class Contact : jbsEntity 
{ 
    public int Id { get; set; } 
    public string Salutation { get; set; } 

    [Required, StringLength(128)] 
    public string FirstName { get; set; } 

    [Required, StringLength(128)] 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string Mobile { get; set; } 
    public string Phone { get; set; } 

} 

public class Image : jbsEntity 
{ 
    public int Id { get; set; } 
    public string FileName { get; set; } 
    public string FilePath { get; set; } 
    public string MimeType { get; set; } 
} 

public class Job : jbsEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string InvoiceNumber { get; set; } 
    public string Comments { get; set; } 
    public string CompletionNotes { get; set; } 
    public string DpscActionRequired { get; set; } 
    public string WorkPerformed { get; set; } 
    public string NextCallInstruction { get; set; } 
    public bool ServiceComplete { get; set; } 
    public DateTime DueDate { get; set; } 
    public DateTime ScheduledDate { get; set; } 
    public DateTime CompletionDate { get; set; } 

    [Required] 
    public int ResidenceId { get; set; } 
    public virtual Residence Residence { get; set; } 

    public virtual List<JobService> JobServices { get; set; } 

    public virtual List<Image> Images { get; set; } 

} 

public class JobService : jbsEntity 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public bool SkimSurface { get; set; } 
    public bool BrushWalls { get; set; } 
    public bool Vacuum { get; set; } 
    public bool BackwashRinse { get; set; } 
    public bool EmptyBaskets { get; set; } 
    public bool CleanElectrodes { get; set; } 
    public bool BalanceWater { get; set; } 
    public bool AddedAcid { get; set; } 
    public bool AddedClarifier { get; set; } 
    public bool SwimClearOnsite { get; set; } 
    public decimal PH { get; set; } 
    public decimal Iron { get; set; } 
    public decimal Copper { get; set; } 
    public decimal Calcium { get; set; } 
    public decimal Chlorine { get; set; } 
    public decimal Alkaline { get; set; } 
    public decimal Stabiliser { get; set; } 

    [Required] 
    public int JobId { get; set; } 
    public virtual Job Job { get; set; } 

    [Required] 
    public int PoolId { get; set; } 
    public virtual Pool Pool { get; set; } 

    public virtual List<Image> Images { get; set; } 

} 


public class User : jbsEntity 
{ 
    public int Id { get; set; } 
    [Required] 
    public string UserName { get; set; } 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [Required] 
    public string Password { get; set; } 
    [Required, Compare("Password")] 
    public string ComparePassword { get; set; } 
} 

と私はこのエラーを取得する:

{"Introducing FOREIGN KEY constraint 'Pool_Residence' on table 'Pools' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.\r\nCould not create constraint. See previous errors."} 

私が問題の原因関係はあると思います:

Customer -> Residences -> Pools 
Job -> JobServices 
Residence -> Jobs 
Pools -> JobServices 

誰も私が私が間違っているとどのようにIてるものを理解するのに役立ちますそれを回避できますか?他の提案も歓迎!

ありがとうございます。

答えて

0

実際には何も間違っているわけではありませんが、SQL Serverでは複数のカスケード削除パスを処理したくありません。実際には、ResidenceからPoolまでの2つの削除パスがあります。

  1. 直接関係、およびResidenceを通じて
  2. - >Job - >JobService - あなたのモデルでは>Pool

外部キー列のすべてが非NULL可能です。したがって、EFはカスケード削除でFKを作成しようとします。

この問題を回避するには、ストアドプロシージャ、トリガー、スルーコードなどの代替メカニズムを使用して、FKのいずれかをヌル可能にし、子エンティティの削除を処理します。

+0

ありがとう、Eranga。それは理にかなっている! – nugget

関連する問題