1

一段时间以来,我一直在研究和阅读如何解决我的问题,甚至认为我发现了类似的问题,但没有任何明确的答案,我尝试的一切似乎都没有奏效。我对 ASP.NET MVC4 有点熟悉(我的主要能力依赖于 PHP 和 MySQL)。出于学习的目的,我决定做一个小项目来增强我的 C# noobie 知识,但我遇到了一个小问题,我觉得这可能很简单,有些事情我没有记住,但我如果您为我提供以下想法或解决方案,将不胜感激:

我创建了以下模型:

public class Address
{
    [Key]
    public int AddId { get; set; }
    public int HouseNo { get; set; }
    public string AddLine1 { get; set; }
    public string AddLine2 { get; set; }
    public string City { get; set; }
    public string PostCode { get; set; }
    //public ICollection<GpModel> GpList { get; set; }
    //public ICollection<PharmacyModel> PharmacyList { get; set; }
}

public class GpModel
{
    [Key]
    public int GpId { get; set; }
    public int AddId { get; set; }
    public string GpName { get; set; }
    public Int64 GpTelephone { get; set; }

    [ForeignKey("AddId")]
    public virtual Address GpAddress { get; set; }
    public ICollection<GpnPharmacy> GpnPharmacies { get; set; }
}

public class PharmacyModel
{
    [Key]
    public int PharmacyId { get; set; }
    public int AddId { get; set; }
    public string PharmacyName { get; set; }
    public Int64 PharmacyTelephone { get; set; }

    [ForeignKey("AddId")]
    public virtual Address PharmacyAddress { get; set; }
    public ICollection<GpnPharmacy> GpnPharmacies { get; set; }
}

public class GpnPharmacy
{
    [Key]
    public int GpnPharId { get; set; }
    public int GpId { get; set; }
    public int PharmacyId { get; set; }

    //[ForeignKey("GpId")]
    public virtual GpModel Gp { get; set; }

    //[ForeignKey("PharmacyId")]
    public virtual PharmacyModel Pharmacy { get; set; }
}

public class MyScriptV1Entities : DbContext
{
    public DbSet<Address> Addresses { get; set; }
    public DbSet<GpModel> Gps { get; set; }
    public DbSet<PharmacyModel> Pharmacies { get; set; }
    public DbSet<GpnPharmacy> GpnPharmacies { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<GpModel>()
            .HasRequired(s => s.GpAddress)
            .WithMany()
            .WillCascadeOnDelete(true);

        modelBuilder.Entity<PharmacyModel>()
            .HasRequired(s => s.PharmacyAddress)
            .WithMany()
            .WillCascadeOnDelete(true);

        base.OnModelCreating(modelBuilder);
    }
}

关系如下:

  • 每个 GpModel 和 PharmacyModel 都有一个地址。
  • PharmacyModel 将“注册”到 0 个或多个 GpModel
  • 一个 GpModel 将有 0 个或多个 PharmacyModel 在其名称下“注册”

Pharmacy基本上我试图在和之间创建多对多关系Gp,为此我认为创建一个单独的表GpnPharmacy来保存它们的ID并基本上“关联”它们是个好主意。

但是我认为我的问题取决于我的模型构建器(我可能错了),但我似乎无法用我在网上找到的东西来解决它。

GpController当我在我的(通过使用/Gp/Details/1)上启动以下操作时

public ActionResult Details(int id)
    {
        var GpModel = MySciptV1DB.Gps.Find(id);
        return View(GpModel);

    }

我没有从数据库中获取第一个 Gp 详细信息,而是收到以下错误:

在表 'PharmacyModel' 上引入 FOREIGN KEY 约束 'FK_dbo.PharmacyModel_dbo.Address_AddId' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
无法创建约束。请参阅以前的错误。

我应该提到,我的应用程序首先使用 SampleData.cs 文件中的数据填充数据库。由于某种原因,这些表尚未创建。

如果您需要更多信息,请随时询问,如果我不够清楚,我很抱歉,但我对 ASP.NET 上的 SQL 有点陌生。非常感谢您的宝贵时间。

问候。

4

1 回答 1

0

我想尝试将以下内容更改为 false 出现在哪里。

.WillCascadeOnDelete(true);

这会创建多个删除级联路径,因为删除地址可能会同时删除 GP 和 Pharma,这反过来可能会导致级联删除到 GpnPharmacy 表的问题。

如果需要级联删除,您应该手动处理删除(例如,通过存储的过程来检查删除内容是否安全,然后从所有涉及的表中删除)。

于 2013-07-24T14:22:13.303 回答