Ответ 1
Я считаю, что вы должны это сделать:
HasRequired(t => t.Agent).WithMany().HasForeignKey(t => t.AgentId)
У меня есть класс AgentBalance с ассоциацией с агентом, таким образом:
public class AgentBalance
{
...
public int AgentId { get; set; }
public virtual Agent Agent { get; set; }
}
AgentId определяется как FK для отношений агента по соглашению, но я хочу сделать его явным в классе Mapping, чтобы быть более безопасным в отношении будущих изменений. Если у агента была коллекция балансов, я знаю, как это сделать, например:
HasRequired(t => t.Agent).WithMany(a => a.Balances).HasForeignKey(t => t.AgentId);
Однако у агента нет коллекции балансов - я не хочу, чтобы эта ассоциация была обратимой. Но без .WithMany в сопоставлении я не получаю возможность указывать .HasForeignKey. Есть ли другой способ? (N.B. Я знаю, что я мог бы также сделать это с помощью атрибутов, но я хочу использовать свободное API-сопоставление).
Я считаю, что вы должны это сделать:
HasRequired(t => t.Agent).WithMany().HasForeignKey(t => t.AgentId)
Я предпочитаю использовать Data Annotations для этих задач, а не Fluent API. Это намного более короткий конец, который легко понять. EF должен автоматически определять свойства, заканчивающиеся на "Id", но чтобы быть в безопасности, вы можете указать их явно:
using System.ComponentModel.DataAnnotations.Schema;
...
public int AgentId { get; set; }
[ForeignKey("AgentId")]
public virtual Agent Agent { get; set; }
Вам нужно будет указать их явно, если ваша поддержка FK не заканчивается "Id", например:
public int AgentCode { get; set; }
[ForeignKey("AgentCode")] // now this is needed if you'd like to have FK created
public virtual Agent Agent { get; set; }
Здесь вы можете найти более подробную информацию: https://msdn.microsoft.com/en-us/data/jj591583.aspx