使用EF6存储数据时排除基础对象

时间:2015-06-12 13:27:48

标签: asp.net entity-framework asp.net-web-api

我有一个类Ticket,它有一些属性。其中三个(视图,任务和键)属性是导航属性。即使在存储故障单之前,这些属性也已存在于数据库中。在我的应用程序中,我首先从数据库加载这些属性,然后创建一个Ticket对象。我只需要将票证(而不是底层对象)保存到数据库,其ID为Key,View和Task(这些是Ticket表中的主要键)

[Table("Tickets")]
public class Ticket
{
    [Key]
    public int Id { get; set; }

    public DateTime? Created { get; set; }

    [Required]
    public View View{ get; set; }

    [Required]
    public Key Key { get; set; }

    public Task Task { get; set; }


}

我尝试像这样保存Ticket对象:

        db.Tickets.Add(ticket);
        db.Entry(ticket.Key).State = System.Data.Entity.EntityState.Unchanged;
        db.Entry(ticket.View).State = System.Data.Entity.EntityState.Unchanged;
        db.Entry(ticket.Task).State = System.Data.Entity.EntityState.Unchanged;

db.SaveChanges();

当我尝试这种方法时,我收到错误:

{"Message":"An error has occurred.","ExceptionMessage":"Saving or accepting changes failed because more than one entity of type 'Key' have the same primary key value. Ensure that explicitly set primary key values are unique. Ensure that database-generated primary keys are configured correctly in the database and in the Entity Framework model. Use the Entity Designer for Database First/Model First configuration. Use the 'HasDatabaseGeneratedOption\" fluent API or 'DatabaseGeneratedAttribute' for Code First configuration.","

甚至可以这样使用Entity Framework吗?首先加载到其对象(Key,View,Task)的预定义数据,然后将这些对象分配给具有这些属性的对象,然后在实体框架上下文中仅添加父对象,在本例中为故障单?

我还试图将底层对象设置为null,但后来我将丢失那些底层对象的数据,这些数据我以后需要在应用程序中使用。 这是底层对象的样子:

    [Table("Views")]
public class View
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Version { get; set; }

    [Required]
    public DateTime? Created { get; set; }
}

    [Table("Keys")]
public class Key
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Version { get; set; }

    [Required]
    public DateTime? Created { get; set; }
}

    [Table("Tasks")]
public class Task
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string Version { get; set; }

    [Required]
    public DateTime? Created { get; set; }
}

1 个答案:

答案 0 :(得分:1)

尝试向对象添加外键并制作所需的外键而不是需要导航属性。像这样:

[Table("Tickets")]
public class Ticket
{
    [Key]
    public int Id { get; set; }

    public DateTime? Created { get; set; }

    [Required]
    public int ViewId {get; set; }

    [ForeignKey("ViewId")]
    public View View{ get; set; }

    [Required]
    public int KeyId {get; set; }

    [ForeignKey("KeyId")]
    public Key Key { get; set; }

    public Task Task { get; set; }

}