所以我有一个文档表和一个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 表中。
或者可为空的外键是预期的行为?
也许您可以在上下文文件中的 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; }
发生这种情况是因为您有一个关系,但这是可选的,可能是一个或没有,如果您需要将此关系强制为必填,则必须将此字段设置为必填:
[Required]
public string UserId { get; set; }