So I have one document table and ApplicationUser table. And one user can upload multiple documents and foreign key constraint has ben applied accordingly using code first approach. But the problem is I am able to save the document without assigning the UserID foreign key id in Documents table. What am I missing here. Below is my novice attempt.
ApplicationUser Model:
it's the standard model provided by the framework.
Document Model:
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; }
}
Post Action
[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");
}
One to Many Migration
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");
}
}
Entry in Documents table:
Expected Behaviour
If I have set up FK constraint properly then I shold have seen the constraint error when saving in database. It should not have allowed NULL values because it is not a valid userId that is there in ApplicationUserId Table.
Or nullable foreign key is the expected behaviour??