1

我在数据库中有表继承:

Ticket{TicketId, TicketTypeId, CreatedBy, Title, Description etc.}
UserInfo{TicketId etc.}

TicketId是主键自增。表UserInfo继承Ticket表,所以TicketId实际上UserInfo是从表FK。 我在 EF 中有模型:TicketIdTicket

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'。”}
更新
我更改CreatedByUserId并传递了此错误,但现在这里还有两个问题:
我将 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可以处理这种情况吗?

4

1 回答 1

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
{
    ...
}

...我收到此错误...

似乎TicketUserInfo具有表的外键,Groups并且此外键属性未设置为有效的组键值。当您插入实体时,违反了数据库中的外键约束,从而导致异常。

于 2012-06-03T12:48:03.607 回答