如何在代码优先的 ASP.NET MVC 5 应用程序中正确设置一对多关系中的外键约束

问题描述 投票:0回答:2

所以我有一个文档表和一个ApplicationUser 表。一个用户可以上传多个文档,并且已使用代码优先方法相应地应用了外键约束。但问题是,我可以保存文档,而无需在文档表中分配 UserID 外键 id 。我在这里缺少什么?以下是我的新手尝试。

应用程序用户模型:

这是框架提供的标准模型。

文档型号:

public class Document
{
    public int Id { get; set; }
    [StringLength(255)]
    public string FileName { get; set; }
    [StringLength(100)]
    public string ContentType { get; set; }
    public byte[] Content { get; set; }
    [StringLength(255)]
    public string DocumentName { get; set; }

    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual ApplicationUser User { get; set; }
} 

行动后

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Document doc, HttpPostedFileBase uploadedresume)
{
    try
    {
        if (ModelState.IsValid)
        {
            if (uploadedresume != null && uploadedresume.ContentLength > 0)
            {
                var tempdoc = new Document
                {
                    FileName = System.IO.Path.GetFileName(uploadedresume.FileName),
                    ContentType = uploadedresume.ContentType,
                    DocumentName = doc.DocumentName
                };
                using (var reader = new System.IO.BinaryReader(uploadedresume.InputStream))
                {
                    tempdoc.Content = reader.ReadBytes(uploadedresume.ContentLength);
                }
                _context.Documents.Add(tempdoc);
            }
            // YOU CAN CLEARLY SEE I HAVE NOT SET THE tempdoc.UserId PROPERTY WITH THE LOGGED  IN USER ID
            // WHY AM I NOT GETTING ERROR HERE CONSTRAINT ERROR??
            _context.SaveChanges();
            return RedirectToAction("Create");
        }
    }
    catch (RetryLimitExceededException /* dex */){
        ModelState.AddModelError("", "");
    }
    return View("Create");
}

一对多迁移

public override void Up()
{
    CreateTable(
        "dbo.Documents",
        c => new
            {
                Id = c.Int(nullable: false, identity: true),
                FileName = c.String(maxLength: 255),
                ContentType = c.String(maxLength: 100),
                Content = c.Binary(),
                DocumentName = c.String(maxLength: 255),
                UserId = c.String(maxLength: 128),
            })
        .PrimaryKey(t => t.Id)
        .ForeignKey("dbo.AspNetUsers", t => t.UserId)
        .Index(t => t.UserId);

}

public override void Down()
{
    DropForeignKey("dbo.Documents", "UserId", "dbo.AspNetUsers");
    DropIndex("dbo.Documents", new[] { "UserId" });
    DropTable("dbo.Documents");
}
}

文档表中的条目:

预期行为

如果我正确设置了 FK 约束,那么在保存到数据库时我应该会看到约束错误。它 不应允许 NULL 值,因为它不是有效的 userId 这是在 ApplicationUserId 表中。

或者可为空的外键是预期的行为?

c# asp.net-mvc asp.net-mvc-5 ef-code-first entity-framework-migrations
2个回答
2
投票

也许您可以在上下文文件中的 onModelCreating 函数中进行配置,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<ApplicationUser>()
            .HasMany(u => u.Documents)
            .WithRequired(d => d.UserId)
            .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

您必须在 ApplicationUser 类中创建一个属性来引用如下文档:

public ICollection<Document> Documents { get; set; }

0
投票

发生这种情况是因为您有一个关系,但这是可选的,可能是一个或没有,如果您需要将此关系强制为必填,则必须将此字段设置为必填:

[Required]
public string UserId { get; set; }
© www.soinside.com 2019 - 2024. All rights reserved.