【问题标题】:Introducing FOREIGN KEY constraint - Database set-up引入 FOREIGN KEY 约束 - 数据库设置
【发布时间】:2013-07-23 22:32:47
【问题描述】:

一段时间以来,我一直在研究和阅读如何解决我的问题,甚至认为我找到了类似的问题,但没有任何明确的答案,我尝试的一切似乎都不起作用。我对 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 “已注册”

基本上,我试图在PharmacyGp 之间创建多对多关系,为此我认为创建一个单独的表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 有点陌生。非常感谢您的宝贵时间。

问候。

【问题讨论】:

    标签: sql-server entity-framework asp.net-mvc-4 database-design foreign-keys


    【解决方案1】:

    我想尝试在下面出现的任何地方将其更改为 false。

    .WillCascadeOnDelete(true);
    

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

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

    【讨论】:

    • 谢谢@Kevin,这实际上解决了我遇到的错误,因此我会接受它。但不幸的是,我现在有另一个问题(大声笑)。我不知道是在这里问另一个问题还是再发一个帖子。但是,我会给您一个简短的说明,以防您或其他人可能知道如何解决它。我的示例数据在GpModelPharmacyModel 上设置了AddID 值,因此它充当将正确地址链接到每个gp 和药房的参考,但这似乎不起作用。我想知道是否有另一种方法可以在我的示例数据上设置 public virtual Address GpAddress 的值?谢谢你:)
    • @Scur4,对不起,我不知道答案。你应该发布另一个问题。祝你好运。
    猜你喜欢
    • 2014-03-20
    • 2019-10-05
    • 2018-08-08
    • 1970-01-01
    • 2016-11-04
    • 2023-03-22
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多