C# 如何使用实体框架从另一个类返回ID或all?

C# 如何使用实体框架从另一个类返回ID或all?,c#,asp.net,entity-framework,class,C#,Asp.net,Entity Framework,Class,我正在学习实体框架,所以如果这对您来说很容易,请不要责怪我 我有班级家庭号码.cs [ScaffoldColumn(false)] [Key] public int HomeNumberId { get; set; } //[ForeignKey("HomeNumberId")] //public virtual HomeNumber HomeNumbers { get; set; } [Required(ErrorMessage = "Polj

我正在学习实体框架,所以如果这对您来说很容易,请不要责怪我

我有班级家庭号码.cs

    [ScaffoldColumn(false)]
    [Key]
    public int HomeNumberId { get; set; }
    //[ForeignKey("HomeNumberId")]
    //public virtual HomeNumber HomeNumbers { get; set; }

    [Required(ErrorMessage = "Polje kućni broj je obavezno!")]
    public string HomeNumberName { get; set; }

    [Required(ErrorMessage = "Polje pod broj/slovo je obavezno!")]
    public string HomeSubNumber { get; set; }

    public int StreetId { get; set; }
    [ForeignKey("StreetId")]
    public virtual Street Street { get; set; }

    ....

    public bool AddHomeNumber(string homeNumberName, string homeSubNumber, Street street)
    {
        HomeNumber number = new HomeNumber();
        number.HomeNumberName = homeNumberName;
        number.HomeSubNumber = homeSubNumber;
        number.StreetId = street.StreetId;

        using (var _db = new DataContext())
        {
            // Dodaj HomeNumber u bazu [AD_HOMENUMBER]
            _db.DB_HomeNumber.Add(number);
            _db.SaveChanges();
        }
        // Success.
        return true;
    }
和class Street.cs

    [ScaffoldColumn(false)]
    [Key]
    public int StreetId { get; set; }

    [Required(ErrorMessage = "Polje naziv ulice je obavezno!")]
    public string StreetName { get; set; }

    .....

    public bool AddStreet(string streetName)
    {
        Street street = new Street();
        street.StreetName = streetName;

        using (var _db = new DataContext())
        {
            // Dodaj Street u bazu [AD_STREET]
            _db.DB_Street.Add(street);
            _db.SaveChanges();
        }
        // Success.
        return true;
    }
我的密码是:

    Street st = new Street();
    st.AddStreet(ucAddress.Street.Text);

    HomeNumber hou = new HomeNumber();
    hou.AddHomeNumber(ucAddress.HouseNumber.Text, ucAddress.HouseSubNumber.Text, st.StreetId);

我需要在我的后台代码st.streetId中添加值,。。。我不知道我错过了什么,。。。因为在AddHomeNumber中,我调用了street.StreetIdst.StreetId的返回值在哪里st.StreetId

我想你想在
AddStreet
上做的事情是这样的。保存街道并返回结果

public Street AddStreet(string streetName)
{
    Street street = new Street();
    street.StreetName = streetName;

    using (var _db = new DataContext())
    {
        // Dodaj Street u bazu [AD_STREET]
        _db.DB_Street.Add(street);
        _db.SaveChanges();
    }
    // Success.
    return street;
}
在代码隐藏中,您在
AddHomeNumber
中通过了
st
而不是
st.StreetId

Street st = new Street();
st = st.AddStreet(ucAddress.Street.Text); // get the street that has been saved with generated id.

HomeNumber hou = new HomeNumber();
hou.AddHomeNumber(ucAddress.HouseNumber.Text, ucAddress.HouseSubNumber.Text, st);
注意:我建议您查看一下存储库模式,它将使您的生活更轻松,并且您将编写更可读、更棒的代码


Street
的基本存储库对于
homernumber
或以相同方式创建存储库的其他实体也是如此

public class StreetRepository 
{
    private DataContext _db;
    public StreetRepository(DataContext dataContext)
    {
        _db = dataContext;
    }

    public Street Add(string streetName)
    {
        Street street = new Street();
        street.StreetName = streetName;

        using (var _db = new DataContext())
        {
            // Dodaj Street u bazu [AD_STREET]
            _db.DB_Street.Add(street);
            _db.SaveChanges();
        }
        // Success.
        return street;
    }

    public Street Get(int id)
    {
        return _db.DB_Street.Find(id);
    }

    // other CRUD methods
}
用法:

StreetRepository streetRepository = new StreetRepository();
HomeNumberRepository homeNumberRepository = new HomeNumberRepository(); // you have to create it yourself

Street st = streetRepository.Add(ucAddress.Street.Text); // get the street that has been saved with generated id.

HomeNumber homeNumber = homeNumberRepository.Add(ucAddress.HouseNumber.Text, ucAddress.HouseSubNumber.Text, st);
注意:您可能会发现为每个实体编写一个存储库是一件痛苦的事情,下面是通用存储库的帮助

掌握了存储库模式后,您可以转到工作单元并发现EntityFramework已经拥有它。

不同的方法

public int AddStreet(string streetName)
{
    Street street = new Street();
    street.StreetName = streetName;

    using (var _db = new DataContext())
    {
        // Dodaj Street u bazu [AD_STREET]
        _db.DB_Street.Add(street);
        _db.SaveChanges();
    }
    // Success.
    return street.StreetId;
}
在代码背后

int pStreetId = 0;
Street st = new Street();
pStreetId = st.AddStreet(ucAddress.Street.Text);

HomeNumber hou = new HomeNumber();
hou.AddHomeNumber(ucAddress.HouseNumber.Text, ucAddress.HouseSubNumber.Text, pStreetId);

您缺少的是在保存objct时将id添加到objct中,仅此而已。

非常感谢您提供此信息!您完全帮助了我:)并感谢您提供有关存储库模式的信息。