[英]Mapping for one to one with nullable value
I have two entity classes, Contact
and User
. 我有两个实体类,
Contact
和User
。
The User
has ContactID
as foreign key to Contact
. User
将ContactID
作为Contact
外键。 I can show relation of the User
to Contact
. 我可以显示
User
与Contact
关系。
Now i also need Contact
to User
relation with the same foreign key in User
table (not in 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;}
}
So i need to make the ContactUser
relation work on Contact
. 所以我需要使
ContactUser
关系在Contact
工作。 What kind of mapping should i use? 我应该使用哪种映射?
Edit 编辑
As suggested I used : modelBuilder.Entity<Contact>().HasRequired(c => c.ContactUser).WithOptional(pi => pi.Contact);
正如我建议的那样:
modelBuilder.Entity<Contact>().HasRequired(c => c.ContactUser).WithOptional(pi => pi.Contact);
I removed ForeignKey
attribute from User
, it as causing Multiplicity...error
我从
User
删除了ForeignKey
属性,原因是它引起了Multiplicity...error
But i get error Like: Invalid column name 'User_Id'.
但是我得到了类似的错误:
Invalid column name 'User_Id'.
What you are looking for is a 您正在寻找的是
One to Zero-or-One Mapping
一对零或一对一映射
There is a great anwser here on StackOverflow . 在StackOverflow上有一个很棒的答案。
In your Case explicit is following required: 在您的情况下,明确要求以下内容:
modelBuilder needs the WithOptional-Methode modelBuilder需要WithOptional-Methode
.WithOptional(pi => pi.Contact);
no Property for the ContactID
没有属性的
ContactID
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; }
}
In the DbContext-Class: 在DbContext-Class中:
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);
}
}
In this Case now says User's Contact property is optional and Contact's User property is required. 在这种情况下,现在说“用户的联系人”属性是可选的,而“联系人的用户”属性是必需的。 I hope this is the right constellation for your project.
我希望这是适合您的项目的星座。
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();
}
}
}
Try this: 尝试这个:
public class Contact
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ContactId { get; set; }
public string ContactName { get; set; }
[ForeignKey("ContactId")]
public User ContactUser { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.