具有可为空值的一对一映射



我有两个实体类,ContactUser

User ContactIDContact的外键。我可以显示UserContact的关系.

现在我还需要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);我从User中删除了ForeignKey属性,它会导致Multiplicity...error

但是我得到错误,例如:Invalid column name 'User_Id'.

您要查找的是一个

一对一映射

在StackOverflow上有一个很棒的anwser。


在您的情况下,显式是必需的:

  • modelBuilder 需要 WithOptional-Methode

    .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-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);
    }
}

在这种情况下,现在说用户的联系人属性是可选的,联系人的用户属性是必需的。我希望这是适合您项目的星座。

控制台测试

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; }
}

最新更新