2015-01-24 4 views
2

У меня есть следующие объекты:Как мне получить навигационные свойства?

public abstract class Meter 
{ 
    public int MeterId { get; set; } 
    public string EANNumber { get; set; } 
    public string MeterNumber { get; set; } 
    [Required] 
    public virtual Premise Premise { get; set; } 
    public abstract void AddReading(CounterReading reading); 
} 

public class GasMeter : Meter 
{ 
    public virtual Counter Counter { get; private set; } 

    public override void AddReading(CounterReading reading) 
    { 
     Counter.Readings.Add(reading); 
    } 
} 

public class Premise 
{ 
    [Key] 
    public int PremiseId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 

    [Required] 
    public virtual Address Address { get; set; } 
    public string Type { get; set; } 

    public virtual GasMeter GasMeter { get; set; } 
} 

У меня есть 1: 1 соотношение между GasMeter и Premise.

Что я должен сделать, чтобы установить myPremise.GasMeter = myMeter и получить myPremise в более позднем коде с myMeter.Premise?

Редактировать При его настройке с помощью Fluent API следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Premise>().HasOptional(p => p.GasMeter) 
      .WithRequired(m => m.Premise); 
    } 

Я получаю следующее исключение при запуске:

исключение типа «System.Data.Entity .ModelConfiguration.ModelValidationException 'произошел в EntityFramework.dll, но не был обработан в коде пользователя

Дополнительная информация : во время создания модели были обнаружены одна или несколько ошибок проверки:

Помещение: FromRole: NavigationProperty «Помещения» недействительна. Тип «GasMeter» FromRole «Premise_GasMeter_Target» в AssociationType «Premise_GasMeter» должен точно соответствовать типу «Meter», на котором объявлен этот NavigationProperty.

Означает ли это, что я не могу использовать Свойства навигации с наследованием? Как бы мне решить мою проблему?

+0

См. Следующее: http://stackoverflow.com/a/27727545/861716 –

+0

@GertArnold См. Мое обновление. –

+1

Либо «публичное виртуальное помещение Premise {get; задавать; } 'должен находиться в' GasMeter', или 'public virtual GasMeter GasMeter' должен быть' public virtual Meter Meter'. –

ответ

0

Я думаю, вам нужно добавить Id каждый класс для ПК/FK отношение

public abstract class Meter 
{ 
    .... 
    public int PremiseId 
    public virtual Premise Premise { get; set; } 
} 

и

public class Premise 
{ 
    .... 
    public int GasMeterId 
    public virtual GasMeter GasMeter{ get; set; } 
} 
+0

После того, как я добавлю свой посыл к своему счетчику, я все еще не вижу метра в своей посылке. Даже с вашим предложением. –

0

Вы, вероятно, не нужно, чтобы связать эти два объекта в качестве виртуальных свойств в друг друга. Попробуйте изменить класс Meter, чтобы сохранить PremiseId, так как это первичный ключ Premise таблицы затем получить предпосылку объект с помощью Select(x => x.PremiseId == aMeter.PremiseId).SingleOrDefault() получить предпосылку сопоставлена ​​этого газового счетчик

public abstract class Meter 
{ 
    public int MeterId { get; set; } 
    public string EANNumber { get; set; } 
    public string MeterNumber { get; set; } 
    public int PremiseId { get; set; } 
    public abstract void AddReading(CounterReading reading); 
} 

SET

var aPremise = new Premise(); 
var aMeter = new GasMeter(); 
aPremise.GasMeter = aMeter; 
aMeter.PremiseId = aPremise.PremiseId; 

ПОЛУЧИТЬ

var thePremise = _repository.Set<Premise>.Select(x => x.PremiseId == aMeter.PremiseId).SingleOrDefault(); 
+1

Использование этого, как это, поражает смысл наличия свойств навигации. –

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

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