Отображение для одного к одному с обнуляемым значением
У меня есть два класса сущностей, 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; }
}