- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个型号:用户资料
public class UserProfile
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
public virtual ICollection<UserPost> UserPost { get; set; }
}
用户帖子:
public class UserPost
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { get; set; }
public string PostTitle { get; set; }
public virtual UserProfile UserProfile { get; set; }
public string Contents { get; set; }
}
UserProfile 与 AspNetUser 具有一对一的关系。
UserProfile 与 UserPost 具有一对多关系。
当我在 Controller 的 Create 方法中将 UserPost 添加到数据库时,我收到 System.Data.Entity.Infrastruct.DbUpdateException
[HttpPost]
[ValidateAntiForgeryToken]
[Authorize]
public ActionResult Create([Bind(Include = "PostTitle, Content")] UserPost post)
{
if (ModelState.IsValid)
{
UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
var user = UserManager.FindById(User.Identity.GetUserId());
post.UserProfile = user.UserProfile;
db.UserPosts.Add(post);
db.SaveChanges();//error here
return RedirectToAction("Index");
}
return View(post);
}
System.Data.Entity.Infrastructure.DbUpdateException occurred HResult=0x80131501 Message=An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.
Inner Exception 1: UpdateException: An error occurred while updating the entries. See the inner exception for details.
Inner Exception 2: SqlException: Cannot insert the value NULL into column 'Id', table 'aspnet-project12017.dbo.UserPosts'; column does not allow nulls. INSERT fails. The statement has been terminated.
最佳答案
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
意味着标有此类属性的列预期具有从 DBMS 自动生成的值,并且作为一般约定,EF 将 string
和 uniqueidentifier
(GUID) 列视为非自动生成的列递增,因此这些列值必须以另一种方式分配(即通过构造函数分配)。
解决主键自增标识列为空问题的常用方法是将其设置为数字数据类型(例如int
):
public class UserPost
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } // change to numeric data type
public string PostTitle { get; set; }
public virtual UserProfile UserProfile { get; set; }
public string Contents { get; set; }
}
然后,在执行迁移时,执行以下步骤:
有时 EF 默认情况下期望您尝试插入到标识列中。如果发生这种情况,请暂时将 StoreGeneratePattern.None
和 DatabaseGenerationOption.None
设置为 UserPost.Id
:
protected void OnModelCreating(DbModelBuilder modelBuilder)
{
// other entities
modelBuilder.Entity<UserPost>()
.HasKey(p => p.Id)
.Property(p => p.Id)
.StoreGeneratedPattern = StoreGeneratedPattern.None;
// other entities
}
确保模型已修改为包含实际的 Id
属性(需要时尝试删除数据库中的 UserPost
表)。
通过程序包管理器控制台运行迁移,如下所示:
Add-Migration "Set Id as Identity Specification"
在 DbMigration
生成的类中,您将看到两个方法:Up()
和 Down()
。修改 Up()
部分以设置 int
数据类型(并在需要时重新运行迁移过程):
public override void Up()
{
CreateTable(
"dbo.UserPost",
c => new
{
Id = c.Int(nullable: false, identity: true),
PostTitle = c.String(),
Contents = c.String(),
})
.PrimaryKey(t => t.Id);
}
如果您仍希望字符串 Id
列作为 UserPost
的主键,则需要将其设置为 [DatabaseGenerate(DatabaseGenerateOption.None)]
并从类构造函数手动分配值(请注意,生成的值必须是唯一的,否则 EF 会告诉您“无法在对象中插入重复的键”):
public class UserPost
{
public UserPost()
{
Id = [[autogenerated value here]];
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string Id { get; set; }
// other properties
}
相关问题:
MVC5 EF6 Seed Method: Cannot insert NULL into column 'Id' table AspNetUsers
Cannot insert the value NULL into column 'Id' (Database first)
Code first - Cannot insert the value NULL into column 'Id'
Entity Framework Cannot insert the value NULL into column Identity Specification set to No
关于c# - MVC EF - System.Data.Entity.Infrastruct.DbUpdateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44942632/
将代码发布到 azure 后,我收到 System.Data.Entity.Infrastruct.UnintentionalCodeFirstException 错误。 即使在连接到 azure S
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我有两个型号:用户资料 public class UserProfile { public int Id { get; set; } public string Name { get;
我一直在尝试使用以下代码从 .Net Core Web 应用程序运行 powershell 脚本(此处不讨论最佳实践;)): string command = @"& """c:\\my Fo
我正在开发一个项目,其中使用 Entity Framework 来操作 sql server 2014 上的数据库。我的代码如下: private void BtnAddUser(object sen
有人可以解释一下 Entity Framework 中两者之间的区别吗? 示例1: obj = new TicketsEntities(); var depts = obj.DEPARTMENTs.S
我有一个小型网络应用程序。在我在应用程序中添加两个 genericHandler 之前,它工作得很好。 我对 http 处理程序进行了以下更改
我正在尝试从下面的 Controller 将模型返回到我的 View 。 JobPost model = (JobPost) (from posts in
我正在尝试从下面的 Controller 将模型返回到我的 View 。 JobPost model = (JobPost) (from posts in
我是一名优秀的程序员,十分优秀!