2017-02-20 35 views
1

Я использую Entity Framework Code Сначала, и мне нужно записать объект в БД и иметь странную проблему, которая заставляет меня думать, что моя модель Entity, вероятно, неверна ,EF Code First: Проблема модели с перекрестными отношениями под-объектов

Объект включает 2 суб-объект типа установки:

var request = new Request(); 
request.StartPosition = new Position(); 
request.EndPosition = new Position(); 
_context.Requests.Insert(request); 

Вот моя модель:

[Table("Requests")] 
public class Request 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public Guid ProductId { get; set; } 


    public virtual int PositionId { get; set; } 

    [ForeignKey("PositionId")] 
    public virtual Position StartPosition { get; set; } 

    [ForeignKey("PositionId")] 
    public virtual Position DestinationPosition { get; set; } 
}//class 


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

    public double X { get; set; } 

    public double Y { get; set; } 

    public virtual ICollection<Request> Requests { get; set; } 


    public Position() 
    { 
     Requests = new List<Request>(); 
    } 
} 

И это исключение я получаю: { "Ссылочная нарушение ограничения целостности. «Зависимая роль имеет несколько принципов с разными значениями».}

+0

Должны ли в каждом из ваших Позиций иметь только один запрос? Изменение общедоступного виртуального ICollection Запросы {get; задавать; } для публичного виртуального запроса запроса {get; задавать;}? – Sami

ответ

1

Я считаю, что классный дизайн может выглядеть примерно так:

[Table("Requests")] 
public class Request 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public Guid ProductId { get; set; } 


    public virtual int StartPositionId { get; set; } 

    public virtual int DestinationPositionId { get; set; } 

    [ForeignKey("StartPositionId")] 
    public virtual Position StartPosition { get; set; } 

    [ForeignKey("DestinationPositionId")] 
    public virtual Position DestinationPosition { get; set; } 
} 


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

    public double X { get; set; } 

    public double Y { get; set; } 

    public virtual ICollection<Request> StartPositionRequests { get; set; } 

    public virtual ICollection<Request> DestinationPositionRequests { get; set; } 

    public Position() 
    { 
     StartPositionRequests = new List<Request>(); 
     DestinationPositionRequests = new List<Request>(); 
    } 
} 

Добавить DbContext может потребоваться дополнительная информация для определения отношений. На EF Core это работает:

public class MyDbContext : DbContext 
{ 
    public DbSet<Request> Requests { get; set; } 
    public DbSet<Position> Positions { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlServer(@"..."); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Position>().HasMany(x => x.StartPositionRequests).WithOne(x => x.StartPosition).OnDelete(DeleteBehavior.Restrict); 
     modelBuilder.Entity<Position>().HasMany(x => x.DestinationPositionRequests).WithOne(x => x.DestinationPosition).OnDelete(DeleteBehavior.Restrict); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^