Отображение для одного к одному с обнуляемым значением

У меня есть два класса сущностей, Contact а также User,

User имеет ContactID как внешний ключ к Contact, Я могу показать отношение User в Contact,

Теперь мне тоже нужно Contact в User отношение с тем же внешним ключом в User стол (не в Contact)

public class Contact{
   public int ContactID {get;set;}
   // This relation doesn't work
   // Need to Make this Work
   public User ContactUser {get;set;}
}

public class User {
   public string Id {get;set;}
   public int? ContactID {get;set;}
   // This Relation works
   [ForeignKey("ContactID")]
   public Contact Contact {get;set;}
}

Так что мне нужно сделать ContactUser отношение работа на Contact, Какое отображение я должен использовать?


редактировать

Как и предполагалось, я использовал:modelBuilder.Entity<Contact>().HasRequired(c => c.ContactUser).WithOptional(pi => pi.Contact);Я удалил ForeignKey атрибут из UserСчитается вызывающим Multiplicity...error

Но я получаю ошибку Invalid column name 'User_Id'.

2 ответа

Решение

То, что вы ищете, это

Однозначное сопоставление

На Stackru есть отличный ответ.


В вашем случае явно требуется следующее:

  • Для ModelBuilder требуется метод WithOptional

    .WithOptional(pi => pi.Contact);

  • нет собственности для ContactID

Пример для EF 6.0

public class Contact
{
    [Key]
    public int ContactId { get; set; }

    public string ContactName { get; set; }
    public User ContactUser { get; set; }
}

public class User
{
    [Key]
    public int UserId { get; set; }

    public string UserName { get; set; }
    public Contact Contact { get; set; }
}

В классе DbContext:

public class CodeFirstContext : DbContext
{
    public CodeFirstContext()
    {
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CodeFirstContext>());            
    }

    public DbSet<Contact> Contacts { get; set; }
    public DbSet<User> Users { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
          .HasRequired(co => co.Contact)
          .WithOptional(cu => cu.ContactUser);

        base.OnModelCreating(modelBuilder);
    }
}

В данном случае теперь говорится, что свойство "Контакт" пользователя является необязательным, а свойство "Пользователь" Контакта является обязательным.Я надеюсь, что это правильное созвездие для вашего проекта.

Консольный тест

class Program
{
    static void Main(string[] args)
    {
        using (var db = new CodeFirstContext())
        {
            Console.Write("Enter a name: ");
            var name = Console.ReadLine();

            var cont = new Contact { ContactName = name };
            db.Contacts.Add(cont);
            db.SaveChanges();

            var usr = new User { UserName = "MyUsername", Contact = cont };
            db.Users.Add(usr);
            db.SaveChanges();

            var query = from b in db.Contacts
                        orderby b.ContactName
                        select b;

            Console.WriteLine("All contacts in the database:");
            foreach (var item in query)
            {
                Console.WriteLine(item.ContactName);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Попробуй это:

public class Contact
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ContactId { get; set; }

    public string ContactName { get; set; }
    [ForeignKey("ContactId")]
    public User ContactUser { get; set; }
}
Другие вопросы по тегам