我在数据库中有表继承:
Ticket{TicketId, TicketTypeId, CreatedBy, Title, Description etc.}
UserInfo{TicketId etc.}
TicketId
是主键自动增量。表格UserInfo
继承了Ticket
表,因此TicketId
UserInfo
FK
的{{1}}来自TicketId
表的Ticket
。{
我有EF模型:
public abstract class Ticket
{
[Key]
public int TicketId { get; set; }
public int TicketTypeId { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public Guid CreatedBy { get; set; }
public virtual User User { get; set; }
}
public class UserInfo :Ticket
{
...
}
当我尝试将新的UserInfo对象插入数据库时,我写道:
User u = context.Users.Find(Membership.GetUser().ProviderUserKey);
UserInfo o = new UserInfo();
o.CreatedBy = u.UserId;
o.Description = "First EF user info to database!";
o.TicketTypeId = 1;
o.Title = "First User Info EF";
context.Tickets.Add(o);
context.SaveChanges();
但应用程序在SaveChanges()上中断 我收到以下错误:
{“无效的列名'User_UserId'。”}
的更新
我将CreatedBy
更改为UserId
并传达了此错误,但现在我还有两个问题:
我将UserInfo保存到数据库,但UserInfo表中没有任何内容。我认为EF可以在保存后添加这个字段吗?
数据库中的这个票证表绑定到UserInfo,但它也被TicketID限制在数据库中的几个表中,但当我尝试保存对象UserInfo时,我收到此错误:
{"The INSERT statement conflicted with the FOREIGN KEY
constraint \"FK_Tickets_Groups\". The conflict occurred in database \"db_Example\", table \"dbo.Groups\", column 'TicketId'.\r\nThe statement has been terminated."}
为了保存这个,我当前删除了除UserInfo之外的表引用。 EF可以处理这种情况吗?
答案 0 :(得分:1)
我将CreatedBy更改为UserId并传递了此错误...
没有必要更改属性名称。您只需要告诉EF CreatedBy
是User
属性的外键(EF不会自动检测到这一点,因为该名称不符合命名约定):
[ForeignKey("User")]
public Guid CreatedBy { get; set; }
public virtual User User { get; set; }
我将UserInfo保存到数据库,但UserInfo表中没有任何内容。一世 以为EF可以在保存后添加这个字段吗?
如果您在单独的表中具有派生实体属性,则必须为此实体指定表名( Table-Per-Type(TPT)继承映射),否则EF将放置所有派生实体默认情况下与基本实体放在同一个表中( Table-Per-Hierarchy(TPH)继承映射):
[Table("UserInfo")]
public class UserInfo : Ticket
{
...
}
......我收到了这个错误...
似乎Ticket
或UserInfo
具有表Groups
的外键,并且此外键属性未设置为有效的组键值。插入实体时,违反了数据库中的外键约束,从而导致异常。